© BEST-BACKGROUNDS/Shutterstock.com

เมื่อพูดถึงการจัดเรียงอาร์เรย์ของข้อมูล มีอัลกอริทึมการเรียงลำดับมากมายที่คุณสามารถใช้ได้ หนึ่งในอัลกอริทึมที่ใช้ง่ายที่สุดคือการเรียงลำดับการแทรก เนื่องจากความเรียบง่ายสัมพัทธ์และธรรมชาติที่เป็นธรรมชาติ อ่านต่อเพื่อสำรวจว่าการเรียงลำดับการแทรกคืออะไร นำไปใช้อย่างไร และใช้งานอย่างไร พร้อมยกตัวอย่าง

การเรียงลำดับการแทรกคืออะไร

การเรียงลำดับการแทรกคือการเรียงลำดับ อัลกอริทึมวิธีหนึ่งที่คุณสามารถใช้เพื่อจัดเรียงอาร์เรย์ วิธีการทำงานนั้นไม่ซับซ้อนเกินกว่าจะเข้าใจและสามารถเปรียบเทียบได้กับวิธีการจัดเรียงสำรับไพ่

ใน ในกรณีนี้ เราจะเริ่มโดยสมมติว่าไพ่ใบแรกในสำรับนั้นเรียงแล้ว จากนั้น เราเลือกการ์ดที่ไม่เรียงลำดับและจัดเรียง สิ่งนี้ทำได้โดยการเปรียบเทียบกับการ์ดใบแรก หากไพ่ที่เลือกมากกว่าไพ่ที่เรียง ไพ่นั้นจะถูกวางไว้ในตำแหน่งทางขวาของไพ่ใบแรก หากการ์ดที่มีปัญหาน้อยกว่าการ์ดที่เรียงไว้ ไพ่นั้นจะถูกวางไว้ในตำแหน่งทางซ้าย

กระบวนการนี้จะดำเนินต่อไปจนกว่าไพ่ที่ไม่เรียงทั้งหมดจะอยู่ในตำแหน่งที่ถูกต้อง ฟังก์ชันการเรียงลำดับการแทรกในลักษณะที่คล้ายกันมาก ค่าข้อมูลที่ไม่เรียงลำดับแต่ละค่าจะถูกจัดเรียงผ่านกระบวนการวนซ้ำประเภทเดียวกัน

เนื่องจากการจัดเรียงแบบแทรกเป็นอัลกอริทึมที่ค่อนข้างง่าย จึงเหมาะที่สุดสำหรับชุดข้อมูลที่มีขนาดค่อนข้างเล็ก รวมถึงชุดข้อมูลที่ค่อนข้างถูกจัดเรียงแล้ว ด้วยวิธีนี้ เรียกได้ว่าเป็นอัลกอริทึมที่ปรับเปลี่ยนได้และมีประสิทธิภาพ ต่อไป เราจะพูดถึงทฤษฎีเบื้องหลังการทำงานของการเรียงลำดับการแทรก

อัลกอริทึมที่อยู่เบื้องหลังการเรียงลำดับการแทรก

วิธีการเรียงลำดับการแทรกสามารถแสดงอย่างกระชับด้วยรหัสจำลองต่อไปนี้:

insertionSort (อาร์เรย์) ทำเครื่องหมายองค์ประกอบแรกว่าเรียงลำดับสำหรับแต่ละองค์ประกอบที่ไม่เรียงลำดับ X’แยก’องค์ประกอบ X สำหรับ j-lastSortedIndex ลงไปที่ 0 ถ้าองค์ประกอบปัจจุบัน j > X ย้ายองค์ประกอบที่เรียงลำดับไปทางขวา 1 วงแบ่งและใส่ X ที่นี่สิ้นสุด insertionSort

พูดง่ายๆ คือถือว่าองค์ประกอบแรกถูกจัดเรียง แต่ละองค์ประกอบที่ตามมาจะถูกเปรียบเทียบกับองค์ประกอบแรก หากมีขนาดเล็กกว่าองค์ประกอบที่จัดเรียง องค์ประกอบนั้นจะถูกเลื่อนลงไปที่ตำแหน่งแรกหรือตำแหน่งที่ 0 ถ้ามากกว่านั้น จะเลื่อนไปทางขวาหนึ่งตำแหน่ง การวนซ้ำจะดำเนินต่อไปจนกว่าองค์ประกอบทั้งหมดจะถูกจัดเรียง

การทำงานภายในของการเรียงลำดับการแทรก

ตอนนี้เราได้กล่าวถึงวิธีการทำงานของการเรียงลำดับการแทรกและทฤษฎีที่อยู่เบื้องหลัง ถึงเวลาแสดงกระบวนการ ด้วยอาร์เรย์ที่เหมาะสม หากเราพิจารณาชุดข้อมูลต่อไปนี้:

เราสามารถถือว่าองค์ประกอบแรก 10 ถูกจัดเรียงแล้ว หลังจากนี้ เรานำองค์ประกอบที่สองคือ 14 และจัดเก็บแยกกัน เมื่อเปรียบเทียบ 14 ถึง 10 เราจะเห็นว่ามีค่ามากกว่า ดังนั้นจึงรักษาตำแหน่งเป็นองค์ประกอบที่สอง นี่เป็นการวนซ้ำครั้งแรก เรียกว่าการผ่านครั้งแรก องค์ประกอบแรก 10 ถูกเก็บไว้ในแถบย่อย

โดยที่สีเขียว=อาร์เรย์ที่เรียงลำดับ

สำหรับรอบที่สอง เราจะไปยังองค์ประกอบที่สามซึ่งก็คือ 5 นี่คือ เมื่อเทียบกับองค์ประกอบก่อนหน้า เราสามารถบอกได้ว่ามันเล็กกว่าองค์ประกอบก่อนหน้า 14 ดังนั้นมันจึงสลับตำแหน่งกับ 14

อัลกอริทึมจะเปรียบเทียบกับองค์ประกอบในแถบย่อยที่เรียงลำดับ 5 ยังเล็กกว่า 10 ดังนั้นจึงย้ายไปที่จุดเริ่มต้นของ subarray อาร์เรย์ที่เรียงลำดับตอนนี้มี 2 องค์ประกอบ — 5 และ 10

ตอนนี้ เราจะไปยังรอบที่สาม ในกรณีนี้ 7 เป็นองค์ประกอบที่เลือก ค่านี้น้อยกว่า 14 ดังนั้นจึงถูกย้ายหนึ่งตำแหน่งไปทางซ้ายและเข้าไปในอาร์เรย์ที่เรียงลำดับ นี่ไม่ใช่ตำแหน่งที่ถูกต้อง เนื่องจาก 7 น้อยกว่า 10 แต่มากกว่า 5 ดังนั้น จึงย้ายไปอีกตำแหน่งหนึ่งทางซ้าย

สำหรับรอบที่สี่ เรากำลังดูตำแหน่งที่สี่ องค์ประกอบ ซึ่งก็คือ 14 ซึ่งถูกจัดเรียงแล้ว ดังนั้นตอนนี้อาร์เรย์ที่จัดเรียงจึงมี 5, 7, 10 และ 14

ผลลัพธ์สุดท้าย

สุดท้าย สำหรับรอบที่ห้า เราใช้องค์ประกอบที่ห้า ซึ่งก็คือ 1 นี่เห็นได้ชัดว่าเล็กกว่า 14 ดังนั้นจึงสลับตำแหน่ง มันยังเล็กกว่า 10 ดังนั้นตำแหน่งจะถูกสลับอีกครั้ง สิ่งนี้ดำเนินต่อไปอีกสองครั้งเนื่องจาก 1 เป็นองค์ประกอบที่เล็กที่สุดในอาร์เรย์ ดังนั้นเราจึงลงเอยด้วยการเรียงลำดับดังนี้:

การดำเนินการของการเรียงลำดับการแทรก

การเรียงลำดับการแทรกสามารถนำไปใช้กับภาษาโปรแกรมต่างๆ จาก C, C# และ C++ เป็น Java, Python, PHP และ Javascript เพื่อจุดประสงค์ในการอธิบาย เราจะทำงานกับ Python กระบวนการทั้งหมดสามารถแสดงได้ในโค้ดต่อไปนี้:

def insertionSort(arr): if (n:=len(arr))=1: return for i in range(1, n): key=arr[i ] j=i-1 ในขณะที่ j >=0 และคีย์ arr[j]: arr[j+1]=arr[j] j-=1 arr[j+1]=ปุ่ม arr=[10, 14, 5, 7, 1] insertionSort(arr) print(arr)

ก่อนอื่น เรากำลังกำหนดตัวเรียงลำดับการแทรกเป็นฟังก์ชันของอาร์เรย์ (arr) จากนั้น เรากำลังบอกว่า ถ้าอาร์เรย์มีความยาว 1 หรือน้อยกว่า อาร์เรย์จะถูกส่งกลับ ต่อไป เราจะกำหนดองค์ประกอบในตำแหน่งที่ i ของอาร์เรย์ที่มีความยาว n เป็นคีย์

เรากำลังใส่ข้อจำกัดในการคำนวณเพื่อให้ j ทำงานได้ก็ต่อเมื่อมีค่ามากกว่าหรือเท่ากับดัชนี 0 เท่านั้น J ถือเป็นค่าทางด้านซ้ายของรายการใดก็ตามที่เรากำลังดู เช่น ต่อ j=ผม-1 ถ้าค่ามากกว่าคีย์ ตำแหน่งจะเลื่อนไปทางขวา

บรรทัดสุดท้าย arr[j+1]=คีย์ กำหนดให้ค่าทางด้านขวาของค่า j นี้กลายเป็นคีย์ใหม่ ดังนั้นตัวเลขที่เหลือจะถูกสลับตามความจำเป็น กระบวนการนี้จะดำเนินต่อไปตั้งแต่ต้น จนกว่าตัวเลขทั้งหมดจะถูกจัดเรียงอย่างถูกต้อง

Insertion Sort in Python: Implementation

เรามาดูกันว่าสิ่งนี้ถูกนำมาใช้ใน Python ภายในสภาพแวดล้อม Spyder อย่างไร เราจะใช้อาร์เรย์เดียวกันกับก่อนหน้านี้เพื่อแสดงให้เห็นอย่างชัดเจน ดูรหัสการใช้งานด้านล่าง:

การใช้การเรียงลำดับการแทรกใน Python

©”TNGD”.com

ประเด็นสำคัญคือการเยื้องเป็นสิ่งสำคัญเมื่อใช้ Python หากใช้การเยื้องไม่ถูกต้อง คุณจะได้รับข้อความแสดงข้อผิดพลาดที่มีลักษณะดังนี้

ได้รับข้อความแสดงข้อผิดพลาด

©”TNGD”.com

กรณีการใช้งานการจัดเรียงการแทรกที่ดีที่สุดและแย่ที่สุด

แม้ว่าการเรียงลำดับการแทรกจะมีประโยชน์สำหรับหลายจุดประสงค์ เช่นเดียวกับอัลกอริทึมใดๆ แต่ก็มีทั้งกรณีที่ดีที่สุดและแย่ที่สุด โดยมากจะขึ้นอยู่กับความซับซ้อนของเวลาและพื้นที่

ความซับซ้อนของเวลาด้วยการเรียงลำดับการแทรก

ความซับซ้อนของเวลาในแต่ละกรณีสามารถอธิบายได้ในตารางต่อไปนี้:

CaseTime ComplexityBestO(n)AverageO(n2)WorstO(n2)

คุณจะเห็นว่าในกรณีที่ดีที่สุด ความซับซ้อนของเวลาเท่ากับ O(n) ซึ่งหมายความว่าไม่จำเป็นต้องเรียงลำดับ เนื่องจากอาร์เรย์ได้รับการจัดเรียงแล้ว เนื่องจากอัลกอริทึมต้องตรวจสอบแต่ละค่าตามลำดับก่อนที่จะสามารถระบุได้ว่ามีการเรียงลำดับอาร์เรย์ ความซับซ้อนของเวลาจึงเป็นเชิงเส้น นั่นคือ ความซับซ้อนเป็นสัดส่วนเชิงเส้นกับขนาดของอินพุต

อย่างไรก็ตาม ในกรณีเฉลี่ยและเลวร้ายที่สุด ความซับซ้อนจะเท่ากับ O(n2) กรณีทั่วไปจะเป็นที่ที่องค์ประกอบในอาร์เรย์สับสน ทั้งจากน้อยไปหามากหรือจากมากไปน้อย ในกรณีที่เลวร้ายที่สุด องค์ประกอบจะต้องเรียงกลับกัน

นี่เป็นเพราะมันอยู่ในลำดับจากน้อยไปมากแล้ว และคุณต้องการลำดับที่ตรงกันข้าม ความซับซ้อนประเภทนี้เรียกว่าเวลากำลังสองเพราะขึ้นอยู่กับ n2 ตัวอย่างเช่น ถ้าขนาดของอินพุตคือ 4 จำนวนการดำเนินการจะเป็น 16

ความซับซ้อนของพื้นที่ที่มีการจัดเรียงการแทรก

ความซับซ้อนประเภทอื่นคือความซับซ้อนของพื้นที่ นี่หมายถึงจำนวนพื้นที่หน่วยความจำที่จำเป็นในการเรียกใช้อัลกอริทึม ความซับซ้อนของ O(1) หมายความว่าจำนวนหน่วยความจำที่ต้องการนั้นคงที่ โดยไม่คำนึงถึงขนาดอินพุต

สิ่งนี้เป็นจริงในกรณีของการเรียงลำดับการแทรก เนื่องจากคุณใช้ตัวแปรชั่วคราวเพียงตัวแปรเดียวกับการดำเนินการแต่ละครั้ง กล่าวคือ ค่าเดียวจะถูกจัดเรียงในแต่ละครั้ง ดังนั้นการใช้หน่วยความจำจึงคงที่

ควรสังเกตว่าการเรียงลำดับการแทรกถือเป็นอัลกอริทึมที่เสถียร หมายความว่าลำดับสัมพัทธ์ขององค์ประกอบที่มีค่าเท่ากันคือ เก็บรักษาไว้ สิ่งนี้มีประโยชน์หากคุณต้องการรักษาลำดับขององค์ประกอบเฉพาะ หรือต้องการจัดเรียงอาร์เรย์ที่จัดเรียงบางส่วนแล้ว นี่เป็นเพราะองค์ประกอบจะไม่สลับกับคีย์หากเทียบเท่า

สรุป

เราได้กล่าวถึงการเรียงลำดับการแทรกและเวลาที่เหมาะสมที่จะใช้ นอกจากนี้ เราได้พิจารณาถึงความซับซ้อนของเวลาและพื้นที่ และแสดงการแสดงรหัสและการใช้งานใน Python หากคุณต้องการจัดเรียงอาร์เรย์ที่มีขนาดค่อนข้างเล็ก โดยเฉพาะอย่างยิ่งอาร์เรย์ที่มีองค์ประกอบบางส่วนถูกจัดเรียงไว้แล้ว การจัดเรียงแบบแทรกเป็นหนึ่งในวิธีที่ดีที่สุดที่จะใช้

ถัดไป

คืออะไร การเรียงลำดับการแทรกและทำงานอย่างไร (พร้อมตัวอย่าง) FAQs (คำถามที่พบบ่อย) 

การเรียงลำดับการแทรกคืออะไร

การเรียงลำดับการแทรกเป็นอัลกอริทึมที่สามารถใช้ในการจัดเรียงชุดข้อมูล ลำดับขึ้นหรือลง มันคล้ายกับวิธีการจัดเรียงสำรับไพ่ในมือของคุณ โดยถือว่าองค์ประกอบแรกนั้นถูกจัดเรียง

จากนั้นแต่ละองค์ประกอบที่ตามมาจะถูกเปรียบเทียบกับองค์ประกอบแรกและวางในตำแหน่งที่ถูกต้อง ไม่ว่าจะปล่อยไว้ที่เดิมหรือเลื่อนไปทางขวาหนึ่งตำแหน่ง สิ่งนี้จะเกิดขึ้นซ้ำสำหรับแต่ละองค์ประกอบ จากนั้นกระบวนการจะดำเนินต่อไปตั้งแต่เริ่มต้นจนกระทั่งองค์ประกอบทั้งหมดได้รับการจัดเรียง

เมื่อใดที่คุณควรใช้การเรียงลำดับการแทรก

การเรียงลำดับการแทรกเหมาะที่สุดสำหรับชุดข้อมูลขนาดเล็กและชุดข้อมูลที่มีการเรียงลำดับค่าบางส่วนแล้ว

ภาษาโปรแกรมใดที่สามารถใช้การเรียงลำดับการแทรกได้

มาก ภาษาการเขียนโปรแกรมสามารถใช้การเรียงลำดับการแทรก รวมถึง C, C++, C#, Java, Javascript, PHP และ Python

ข้อดีของการเรียงลำดับการแทรกคืออะไร

ข้อดีของการจัดเรียงแบบแทรกคือง่าย ลำดับสัมพัทธ์ของคีย์ไม่เปลี่ยนแปลง มีประสิทธิภาพสำหรับชุดข้อมูลขนาดเล็ก และความจริงที่ว่าสามารถจัดเรียงรายการในขณะที่ได้รับข้อมูล

การจัดเรียงการแทรกได้รับการปรับให้เหมาะสมอย่างไร

การจัดเรียงการแทรกได้รับการปรับให้เหมาะสมโดยการสร้างแถบย่อยที่เก็บไว้ ซึ่งค่าที่เรียงลำดับจะถูกเก็บไว้ชั่วคราว ซึ่งหมายความว่าไม่จำเป็นต้องสลับองค์ประกอบอาร์เรย์ทั้งหมดระหว่างการวนซ้ำแต่ละครั้ง เนื่องจากองค์ประกอบจะสลับทีละรายการ

การเรียงลำดับการแทรกมีการวนซ้ำกี่ครั้ง

/strong>

ด้วยอาร์เรย์ที่มีความยาว n จึงต้องใช้การวนซ้ำ n-1 ครั้งเพื่อจัดเรียงอาร์เรย์ทั้งหมด

การจัดเรียงการแทรกสามารถแก้ไขได้อย่างไร

การเรียงลำดับการแทรกสามารถแก้ไขได้โดยใช้การเรียงลำดับการแทรกแบบไบนารี สิ่งนี้คล้ายกับการเรียงลำดับการแทรกตรงที่เป็นอัลกอริทึมที่เสถียร แต่จะลดจำนวนการเปรียบเทียบที่ต้องทำ

ความซับซ้อนของเวลาลดลงจาก O(n) เป็น O(log n) เนื่องจาก ใช้การค้นหาแบบไบนารีมากกว่าการค้นหาเชิงเส้น แต่ละค่าจะถูกเปรียบเทียบกับค่าในแถบย่อยที่เรียงลำดับเพื่อพิจารณาว่าค่าใดมีค่ามากกว่าค่าที่เลือก ซึ่งจะทำให้จำนวนการดำเนินการสั้นลง

การเรียงลำดับการแทรกมีข้อเสียอย่างไร

การเรียงลำดับการแทรกไม่เหมาะสมสำหรับชุดข้อมูลขนาดใหญ่เป็นพิเศษ เนื่องจาก ความซับซ้อนของเวลาโดยเฉลี่ยและกรณีที่แย่ที่สุดคือกำลังสอง

ทางเลือกอื่นนอกเหนือจากการเรียงลำดับการแทรกคืออะไร

ด้วยชุดข้อมูลขนาดใหญ่และสับสน ทางเลือกอื่นที่เหมาะสมกว่า คือการเรียงลำดับอย่างรวดเร็ว การเรียงลำดับแบบผสาน หรือการจัดเรียงแบบฮีป

การเรียงลำดับการแทรกเป็นอัลกอริทึมที่เสถียรหรือไม่

ใช่ การเรียงลำดับการแทรกถือเป็นอัลกอริทึมการเรียงลำดับที่เสถียร เนื่องจากองค์ประกอบจะไม่เปลี่ยนแปลงหากมีค่าเท่ากับคีย์ ลำดับขององค์ประกอบจะยังคงอยู่หากเทียบเท่ากัน

By Kaitlynn Clay

ฉันทำงานเป็นผู้เชี่ยวชาญด้าน UX ฉันสนใจในการออกแบบเว็บและการวิเคราะห์พฤติกรรมผู้ใช้ ในวันหยุดของฉัน ฉันมักจะไปเยี่ยมชมพิพิธภัณฑ์ศิลปะเสมอ