Home    Previous page การเรียงลำดับโดยวิธีการพิเศษ Next page
การเรียงลำดับโดยใช้การนับ Counting sort
การจัดเรียงทั้งหมดที่เราได้เรียนรู้มาเช่น Selection sort, Insertion sort, Bubble sort, Heap sort, Merge sort, Quick sort เป็นการจัดเรียงโดยใช้การเปรียบเทียบระหว่างข้อมูลเป็นหลัก ซึ่งเราสามารถพิสูจน์ให้เห็นแล้วว่า การจัดเรียงดังกล่าวจะมี Running time ไม่ดีไปกว่า O(n lg n) แต่ทว่าถ้า เรามีการจัดเรียงข้อมูลซึ่งค่าของข้อมูลเป็นจำนวนเต็มที่อยู่ระหว่าง 1 ถึง k แล้ว เราสามารถเขียนขั้นตอนวิธีที่ จัดเรียงตัวเลขชุดดังกล่าว (โดยใช้ counting sort) ซึ่งใช้เวลา O(n) ถ้า k = O(n)
หลักการสำคัญคือ เราจะเขียนขั้นตอนที่คำนวณว่า สำหรับแต่ละค่าของ x มีข้อมูลอยู่กี่ตัวที่น้อยกว่าหรือเท่ากับ x
ถ้าเราทราบว่ามีข้อมูล 5 ตัวซึ่งน้อยกว่า x แล้วเราจะได้ว่า x ต้องอยู่ตำแหน่งที่ 6 โดยอัตโนมัติ ซึ่งการคำนวณนี้จะไม่ใช้เวลาที่มากนัก
ขั้นตอนวิธี COUNTING-SORT(A, B, k) เมื่อ A เป็นข้อมูลเข้า n, B เป็นข้อมูลที่จัดเรียงและ k เป็นจำนวนเต็มที่ใหญ่ที่สุดใน A
ข้อมูลเข้า A[1..n], k
ข้อมูลออก B[1..n] โดยที่ B[1] < B[2] < B[3] < . . . < B[n]
COUNTING-SORT(A, B, k)
1. for i = 1 to k;
2.    C[i] = 0;
3. endfor
4. for j = 1 to length[A];
5.    C[A[j]] =  C[A[j]] + 1;
6. endfor
7. for i = 2 to k;
8.    C[i] = C[i] + C[i-1];
9. endfor
10. for j = length[A] downto 1;
11.    (B[C[A[j]]], C[A[j]]) =  (A[j], C[A[j]]-1);
12. endfor

ตัวอย่างที่ 1 จงเรียงข้อมูลต่อไปนี้โดยใช้ Counting sort
3, 6, 4, 1, 3, 4, 1, 4
8, 2, 3, 1, 3, 2, 5, 6, 7

การจัดเรียงโดยใช้ฐาน Radix sort
การจัดเรียงประเภทนี้ใช้กับข้อมูลที่สามารถจัดได้เป็นกลุ่ม ๆ เช่น การจัดเรียงตัวเลขฐานสิบ โดยเราแบ่งกลุ่มตามค่าของตัวเลขโดดในแต่ละตำแหน่ง หลังจากที่แต่ละกลุ่มถูกแบ่งแล้วเราจึงจัดเรียง อาจเริ่มจากหลักที่มากที่สุด แล้วลดหลั่นลงมาจนถึง หลักหน่วย หรือ จัดเรียงโดยเริ่มจากหลักหน่วยไปหลักสิบไปหลักร้อย และต่อไปเรื่อย ๆ จนครบทุกหลัก สำหรับขั้นตอนวิธีที่เราเขียนจะใช้ หลักการแบบที่สอง คือเรียงตัวเลขโดยเริ่มจากกลุ่มเลขโดดในหลักหน่วย แล้วไล่ขึ้นไปจนถึงหลักสุดท้าย แต่เราต้องใช้วิธีการเรียงลำดับที่มีสมบัติ stable
ขั้นตอนวิธีการจัดลำดับที่มีสมบัติ stable หมายความว่า ถ้าข้อมูลสองจำนวนใด ๆ มีค่าเปรียบเทียบที่เหมือนกันแล้ว ลำดับของการจัดเรียงของ ข้อมูลทั้งสองตัวนั้นจะอยู่ในลำดับเดียวกับข้อมูลก่อนถูกจัดเรียง เช่น
11, 32, 43, 34, 15 หลังจากผ่านขั้นตอนการจัดลำดับที่ stable จะได้ 11, 15, 32, 34, 43 เมื่อเลขดรรชนีล่างบ่งบอกลำดับเริ่มต้นก่อนการจัดเรียง
ขั้นตอนวิธี RADIX-SORT(A, d) เมื่อ A เป็นข้อมูลเข้า n ที่แต่ละค่ามีจำนวนตัวเลขสูงสุด d ตัว และ d เป็นตำแหน่งสุดท้าย (most-significant digit) ของตัวเลขใน A
ข้อมูลเข้า A[1..n], d
ข้อมูลออก A[1..n] โดยที่ A[1] < A[2] < A[3] < . . . < A[n]
RADIX-SORT(A, d)
1. for i = 1 to d
2.    use a stable sort to sort array A on digit i
3. endfor

ตัวอย่างที่ 2 จงเรียงข้อมูลต่อไปนี้โดยใช้ Radix sort กับ Insertion sort แทน stable sort
  • 329, 457, 657, 839, 436, 720, 355
  • 80, 22, 13, 01, 56, 22, 51, 62, 43
  • 87988, 82834, 23432, 26679, 58740, 15423, 33456

การจัดเรียงโดยใส่กล่อง Bucket sort
ถ้าเราพบว่าข้อมูลมีการกระจายแบบ uniform บนช่วง [0, 1) โดยเราจะแบ่งช่วง [0, 1) ออกเป็น n ช่วงย่อยเท่า ๆ กันใส่ในกล่อง (buckets) แล้วเรียงข้อมูลในแต่ละกล่อง ข้อมูลทั้งหมดที่เรียงได้จากการนำข้อมูลที่ถูกจัดเรียงออกมาโดยการไล่ดึงออกจากแต่ละกล่อง
ขั้นตอนวิธี BUCKET-SORT(A) เมื่อ A เป็นข้อมูลเข้า n ที่แต่ละค่าเป็นจำนวนระหว่างช่วง [0, 1)
ข้อมูลเข้า A[1..n]
ข้อมูลออก A[1..n] โดยที่ A[1] < A[2] < A[3] < . . . < A[n]
BUCKET-SORT(A)
1. n = length[A]
2. for i = 1 to n
3.     insert A[i] into list B[  n A[i]  ]
4. endfor
5. for i = 0 to n-1
6.     sort list B[i] with insertion sort
7. endfor
8. concatenate the list B[0], B[1], ..., B[n-1] in order
จงเรียงข้อมูลต่อไปนี้โดยใช้ Bucket sort
  • 0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68
  • 0.80, 0.22, 0.13, 0.01, 0.56, 0.32, 0.71, 0.62, 0.94
  • 0.3487, 0.828, 0.44435, 0.234, 0.667, 0.970, 0.5874 0.032, 0.154, 0.489, 0.3345, 0.6987

Home | Previous | Next


© Copyright by กรุง สินอภิรมย์สราญ