อัลกอริทึมการจัดอันดับ
| English | ไทย |
|---|---|
| bubble sort/ˈbʌbl sɔːt/ | bubble sort |
| insertion sort/ɪnˈsɜːʃn sɔːt/ | insertion sort |
| in place/ɪn pleɪs/ | ในสถานที่ |
| stable/ˈsteɪbl/ | เสถียร |
การเรียงลำดับที่ช้าอย่างตั้งใจ
- คลังข้อมูลระดับมืออาชีพทั้งหมดใช้อัลกอริทึมในการเรียงลำดับที่ไม่ได้สอบให้เขียน Bubble sort และ Insertion sort มีค่า $O(n^2)$ ทั้งคู่ และถูกจัดอันดับต่ำกว่าการเรียงลำดับที่ดีในรายการขนาดใหญ่
- พวกเขาอยู่ในหลักสูตร anyway และเพื่อเหตุผลที่ดี: มีความยาวพอที่จะทำ trace ด้วยมือ และการทำ trace หนึ่งครั้งคือวิธีที่คุณเรียนรู้ว่าการเรียงลำดับ ทำอะไร กับอาเรย์จริงๆ
- ยังมีกรณีการใช้งานจริงสำหรับ insertion sort ในรายการขนาดเล็กหรือที่เรียงลำดับมาเกือบเต็มแล้ว มันเร็วที่สุดในบรรดาทั้งหมด และคลังข้อมูลจริงจะสลับไปใช้สำหรับกรณีเหล่านี้โดยเฉพาะ
- บทเรียนนี้คือ bubble sort และ insertion sort: อัลกอริทึม, พฤติกรรมของแต่ละตัว และจุดที่แต่ละตัวชนะ
การเรียงลำดับแบบฟองอากาศ (Bubble sort)
FOR pass ← 1 TO n - 1
swapped ← FALSE
FOR i ← 1 TO n - pass
IF A[i] > A[i + 1] THEN
swap A[i], A[i + 1]
swapped ← TRUE
ENDIF
NEXT i
IF NOT swapped THEN // already sorted
EXIT FOR
ENDIF
NEXT pass
- แต่ละรอบจะเปรียบเทียบ คู่ที่อยู่ติดกัน และสลับหากไม่ถูกต้อง ทำให้ค่าที่เหลือมากที่สุด "ลอย" ไปยังท้ายรายการ
- หลังรอบที่ $k$元素 $k$ ตัวสุดท้ายจะเป็นตำแหน่งสุดท้ายแล้ว นี่คือเหตุผลที่วงลูปภายในหยุดที่ $n - \text{pass}$
- ป้าย
swappedช่วย让它หยุดเร็วขึ้น: หากรอบหนึ่งไม่มีการสลับใดเลย รายการนั้นจะถูกเรียงลำดับแล้ว
Insertion sort
FOR i ← 2 TO n
key ← A[i]
j ← i - 1
WHILE j >= 1 AND A[j] > key DO
A[j + 1] ← A[j] // shift right
j ← j - 1
ENDWHILE
A[j + 1] ← key // drop it in
NEXT i
- มันสร้าง ส่วนที่เรียงลำดับแล้วที่ด้านหน้า ซึ่งขยายขึ้นหนึ่งขั้นตอนในแต่ละครั้ง ตัว στοι mới จะถูกวางไว้ชั่วคราวเป็น
key, ตัว στοι ที่ใหญ่กว่าจะเลื่อนไปทางขวาเพื่อเปิดช่องว่าง และใส่คีย์เข้าไปในช่องนั้น - นี่คือวิธีที่คนส่วนใหญ่เรียงไพ่ในมือ ซึ่งเป็นการเปรียบเทียบที่ข้อสอบคาดหวัง

*ฝั่งซ้ายเรียงแล้ว ฝั่งขวา untouched และขอบเขตเคลื่อนที่ไปทางขวา
อัลกอริทึมการจัดอันดับ
เปรียบเทียบองค์ประกอบที่อยู่ติดกัน สลับหากจำเป็น
ผ่าน bubble sort: แต่ละรอบจะลอยค่าที่ใหญ่ที่สุดไปยังท้ายรายการ
bubble sort ทำงานโดย:
แต่ละรอบสลับคู่ที่อยู่ติดกัน "bubbling" องค์ประกอบที่ใหญ่ที่สุดไปยังท้ายรายการ
ความซับซ้อนของเวลาเฉลี่ย/กรณีแย่ที่สุดของ bubble sort คือ:
ลูปซ้อนกันสองชั้นเหนือ n องค์ประกอบให้ O(n²); กรณีที่ดีที่สุด (เรียงลำดับอยู่แล้ว) คือ O(n) ด้วย exit ล่วงหน้า
ตัวอย่างวิธีทำ: ทำตามกระบวนการหนึ่งรอบ
- ทำ trace รอบแรกของการเรียงแบบ bubble บน 5, 3, 8, 1
- เปรียบเทียบ 5 และ 3: ไม่ถูกต้อง สลับ ได้ 3, 5, 8, 1 เปรียบเทียบ 5 และ 8: ถูกต้อง ไม่สลับ เปรียบเทียบ 8 และ 1: สลับ ได้ 3, 5, 1, 8
- หลังหนึ่งรอบ ค่าที่ใหญ่ที่สุด 8 จะอยู่ในตำแหน่งสุดท้าย และสามารถข้ามการเปรียบเทียบหนึ่งครั้งต่อรอบตั้งแต่นี้ต่อไป
- ตอนนี้ทำ trace ขั้นตอนที่สามของ insertion sort บน 3, 5, 8, 1 คีย์คือ 1 เลื่อน 8, 5 และ 3 ไปทางขวาทีละตำแหน่ง แล้ววาง 1 ไว้ด้านหน้า: 1, 3, 5, 8 แสดงอาเรย์หลังจากแต่ละขั้นตอน นั่นคือที่คะแนนจะอยู่ที่นั่น
Insertion sort สร้างผลลัพธ์ที่เรียงลำดับโดย:
มันสร้างพรีฟิกซ์ที่เรียงลำดับทางซ้าย ย้ายองค์ประกอบที่ใหญ่ขึ้นไปทางขวาเพื่อวางแต่ละคีย์ลงตำแหน่ง
insertion sort วางองค์ประกอบใหม่แต่ละตัวอย่างไร?
การเก็บคีย์ไว้ด้านข้างและการย้ายต่างหากที่ทำให้แตกต่างจากการสลับที่อยู่ติดกันซ้ำๆ ของ bubble sort
ประสิทธิภาพ
| bubble | insertion | |
|---|---|---|
| กรณีที่ดีที่สุด | $O(n)$, หนึ่งรอบโดยไม่มีการสลับ | $O(n)$, เรียงแล้ว ไม่มีการเลื่อน |
| เฉลี่ยและกรณี最差 | $O(n^2)$ | $O(n^2)$ |
| หน่วยความจำเสริม | $O(1)$, in place | $O(1)$, in place |
| มั่นคง | ใช่ | ใช่, stable |
- In place หมายความว่าต้องใช้หน่วยความจำเสริมเพียงจำนวนคงที่ เรียงลำดับภายในอาเรย์เอง Stable หมายความว่าค่าที่เท่ากันสองค่าจะรักษาลำดับสัมพัทธ์เดิมไว้ ซึ่งสำคัญเมื่อรายการถูกเรียงลำดับด้วยฟิลด์อื่นมาก่อน
- ทั้งคู่ถึง $O(n)$ บนข้อมูลที่เรียงลำดับอยู่แล้ว แต่เฉพาะถ้า bubble sort มี flag
swappedเท่านั้น如果没有มัน总会执行每一轮
หลังจากรอบแรกของ bubble sort บน 5, 3, 8, 1resultarray的是什么?Write the four numbers separated by commas.
5 และ 3 สลับกัน, 5 และ 8 ไม่สลับ, 8 และ 1 สลับกัน ค่าที่ใหญ่ที่สุดได้ไปถึงท้ายแล้ว ดังนั้นรอบถัดไปสามารถสั้นลงหนึ่งการเปรียบเทียบ
ตัวอย่างวิธีทำ: การเรียงลำดับใด และทำไม
- รายการ 200,000 บันทึกต้องเรียงลำดับใหม่จากศูนย์ ไม่มีทั้งสอง: ทั้งคู่มีค่า $O(n^2)$ ดังนั้นต้องใช้ merge หรือ quick sort ที่ $O(n \log n)$ บอกให้ชัดเจนแทนการเลือกสิ่งที่ไม่แย่ที่สุด
- รายการเรียงลำดับ 10,000 รายการได้รับ 5 รายการใหม่เพิ่มท้ายและต้องเรียงลำดับอีกครั้ง Insertion sort: ข้อมูลเรียง而来AlmostFull newItem only shifts a short distance และเข้าใกล้ $O(n)$
- ตัวอย่างการสอนที่ต้องทำ trace ด้วยมือบนกระดาษ Bubble sort: ง่ายต่อการติดตามที่สุด นี่คือการใช้งานที่เหลืออยู่จริง
- อธิบายเหตุผลจาก สถานะของข้อมูล และ ขนาด ไม่ใช่จากความชอบทั่วไป
จับคู่แนวคิดการจัดอันดับแต่ละอย่างกับความหมายของมัน
bubble swaps neighbours, insertion grows a sorted prefix; both are O(n²) worst-case; stability is about equal-key order.
การเรียงแบบแทรกทำงานใกล้เคียง O(n) กับอาร์เรย์ขนาดเล็กหรือเกือบเรียงลำดับแล้ว เนื่องจากมีองค์ประกอบน้อยมากที่ต้องย้ายตำแหน่ง
กับข้อมูลเกือบเรียงลำดับแล้ว แต่ละรายการใหม่จะอยู่ในตำแหน่งที่ถูกต้องเกือบทั้งหมด — นั่นคือเหตุผลที่การเรียงแบบแทรกชนะการเรียงแบบซับซ้อนอื่นๆ ในอินพุตขนาดเล็ก
ข้อใดเป็นจริงสำหรับทั้งการเรียงแบบฟองอากาศและการเรียงแบบแทรก? เลือก ทุก ข้อที่ถูกต้อง
กับรายการไม่เรียงลำดับขนาดใหญ่ การเรียงแบบ O(n log n) จะชนะอย่างเด็ดขาด การกล่าวเช่นนี้คือคำตอบที่ถูกต้อง ไม่ใช่การเลือกสิ่งที่ยังดีที่สุดในสองสิ่ง
ทำไมหนึ่งรอบจึงไม่ใช่เรื่องราวทั้งหมด
- ทั้งสองการเรียงลำดับทำหลายรอบ และข้อสอบแยกแยะโดยสิ่งที่ หนึ่งรอบทำได้ และ เมื่อไหร่他们就停下来
- การทำรอบของ บับเบิลโซर्ट เปรียบเทียบคู่ ที่อยู่ติดกัน และสลับพวกมัน ดังนั้นการทำรอบหนึ่งจะพาองค์ประกอบที่เหลือมากที่สุดไปยังตำแหน่งสุดท้าย การเรียงลำดับทั้งหมดใช้ $n - 1$ รอบ
- พาสของ insertion sort จะนำ ตัว στοι ถัดไป มาเคลื่อนย้ายกลับเข้าไปในส่วนที่เรียงลำดับแล้วแล้ว ดังนั้นหลังจาก $k$ พาส ตัว στοι แรก $k$ ตัวจะเรียงลำดับ ระหว่างกันเอง แต่ยังไม่ได้อยู่ในตำแหน่งสุดท้าย
- Bubble sort สามารถปรับปรุงได้ด้วย flag: หากรอบใดรอบหนึ่งไม่มีการสลับตำแหน่งใดๆ แสดงว่ารายการนั้นถูกเรียงลำดับเรียบร้อยแล้วและอัลกอริทึมจะหยุดทำงาน สำหรับข้อมูลที่ถูกเรียงลำดับเกือบสมบูรณ์แล้ว วิธีนี้จะทำให้การทำงานเหลือเพียงรอบเดียว
- โดยไม่มี flag ทั้งสองกรณีจะมี $n^2$ ในกรณี 최악 ซึ่งนี่คือเหตุผลที่ทั้ง two เป็นตัวเลือกที่ไม่ดีสำหรับไฟล์ขนาดใหญ่ และทำไมข้อสอบจึงถามถึงไฟล์ขนาดเล็กเท่านั้น
รายการที่ 10,000 บันทึกแล้วเรียงลำดับเพิ่ม 5 บันทึกใหม่ที่ปลายสุด การเรียงแบบใดเหมาะสำหรับการจัดเรียงใหม่อีกครั้ง?
ข้อมูลที่ถูกเรียงลำดับเกือบสมบูรณ์คือกรณีที่ดีที่สุดของอัลกอริทึมการแทรก (insertion sort) โดยมีความซับซ้อน接近 O(n) เตาจัดเก็บจริงจะเปลี่ยนไปใช้วิธีนี้ด้วยเหตุผลดังกล่าว
จับคู่การเรียงแต่ละแบบกับสิ่งที่ทำได้ในหนึ่งรอบ
ความแตกต่างนี้คือสิ่งที่คำถามแบบติดตามสถานะ (trace question) ทดสอบจริงๆ ตัวบอกรับใน bubble sort ยังช่วยให้หยุดเร็วขึ้นเมื่อข้อมูลเรียงเกือบสมบูรณ์ ซึ่งเป็นจุดที่ insertion sort ทำได้ดีอยู่แล้ว
คะแนนที่หลุดหายไป
- Bubble sort เปรียบเทียบคู่ adjacent คำตอบที่เปรียบเทียบองค์ประกอบหนึ่งกับอีกทั้งหมดกำลังอธิบายอัลกอริทึมที่แตกต่างกัน
- ลูปภายในจะสั้นลงทุกครั้งที่วนซ้ำ เพราะส่วนท้ายของอาร์เรย์ถูกกำหนดค่าไว้แล้ว บอกเหตุผล
- Sort แบบแทรก (insertion sort) เลื่อนองค์ประกอบไปทางขวาเพื่อเปิดช่องว่าง; ไม่ได้สลับตำแหน่งซ้ำๆ ความแตกต่างนี้คือหัวใจสำคัญของอัลกอริทึม
- ทั้งสองมี $O(n^2)$ โดยเฉลี่ยและในกรณีแย่ที่สุด, และ $O(n)$ ในกรณีดีที่สุด ให้ระบุกรณีพร้อมลำดับความซับซ้อน
คุณเข้าใจแล้ว
- bubble sort: การวนซ้ำหลายรอบเปรียบเทียบคู่ที่ ติดกัน และสลับตำแหน่ง, ตัวใหญ่ที่สุดลอยขึ้นสู่ส่วนท้าย, ลูปภายในสั้นลงทุกครั้งที่วนซ้ำ, พร้อม
swappedเพื่อออกก่อนกำหนดเมื่อไม่มีการสลับ - insertion sort: ขยายส่วนที่เรียงลำดับแล้วด้านหน้า, เก็บคีย์ปัจจุบันไว้ข้างหนึ่ง, เลื่อนองค์ประกอบที่ใหญ่กว่าไปทางขวา แล้ววางคีย์ลงในช่องว่าง
- ทั้งสองมี $O(n^2)$ โดยเฉลี่ยและกรณีแย่ที่สุด, $O(n)$ กรณีดีสุด, ทำงานในสถานที่ (in place) และ คงที่ (stable)
- insertion sort ชนะจริงในรายการที่มี ขนาดเล็กหรือเรียงลำดับเกือบสมบูรณ์; สำหรับรายการขนาดใหญ่ที่ไม่ได้เรียงลำดับ Neither เป็นคำตอบที่เหมาะสม