บทที่ 9 การเรียงล าดับข้อมูล Sorting) ( By Juthawut Chantharamalee

Download Report

Transcript บทที่ 9 การเรียงล าดับข้อมูล Sorting) ( By Juthawut Chantharamalee

บทที่ 9 การเรียงลาดับข้อมูล
(Sorting)
By Juthawut Chantharamalee
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
1
ประเภทการเรียงลาดับข้อมูล (Sort Classifications)
การเรียงลาดับข้อมูลแบบภายใน (Internal Sorting)
เป็ นการเรียงลาดับข้อมูลภายในหน่วยความจาหลัก (Primary
Memory) ของเครือ่ งคอมพิวเตอร์ โดยข้อมูลทัง้ หมดจะอยู่ใน
หน่วยความจาหลักในระหว่างการประมวลผลเพือ่ จัดเรียงข้อมูล สาหรับการ
เรียงลาดับข้อมูลแบบภายในจะเหมาะสมกับข้อมูลในปริมาณไม่มาก อัน
เนือ่ งมาจากหน่วยความจาหลักนัน้ มีความจากัด โดยตัวอย่างวิธกี าร
เรียงลาดับข้อมูลแบบภายใน เช่น Insertion Sort, Shell Sort, Selection
Sort, Heap Sort, Bubble Sort, และ Quick Sort เป็ นต้น
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
2
การเรียงลาดับข้อมูลแบบภายนอก (External Sorting)
เป็ นการเรียงลาดับข้อมูลภายในหน่วยความจาหลัก เฉพาะส่วนข้อมูล
ทีต่ ้องการจัดการเรียงในขณะนัน้ กล่าวคือ ข้อมูลทัง้ หมดทีต่ ้องการ
จัดเรียงจะไม่สามารถนาไปใส่ไว้ในหน่วยความจาหลักพร้อมกันเพือ่
ประมวลผลได้ทงั้ หมดในคราวเดียวกัน เนือ่ งจากมีปริมาณข้อมูลมาก
ดังนัน้ จึงต้องกันข้อมูลบางส่วนไปเก็บไว้ในสือ่ จัดเก็บข้อมูลสารอง
(Secondary Storage) เช่น ฮาร์ดดิสก์ หรือเทป สาหรับเรียงลาดับ
ข้อมูลแบบภายนอกนีเ้ หมาะสมกับการเรียงลาดับข้อมูลในปริมาณมาก
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
3
Sort
Internal
External
(merges)
Selection
Insertion
Exchange
Selection Heap
Insertion Heap
Bubble Quick
รูปที่ 9.1 ประเภทของการเรียงลาดับข้อมูล
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
4
1. ประเภทการเรียงลาดับแบบภายใน (Internal)
1.1 วิธกี ารเรียงลาดับแบบเลือก (Selection)
1.11 การเรียงลาดับข้อมูลแบบ Selection Sort
1.12 การเรียงลาดับข้อมูลแบบ Heap Sort
1.2 วิธกี ารเรียงลาดับแบบแทรก (Insertion)
1.21 การเรียงลาดับข้อมูลแบบ Insertion Sort
1.22 การเรียงลาดับข้อมูลแบบ Shell Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
5
1.3 วิธกี ารเรียงลาดับแบบแลกเปลีย่ น (Exchange)
1.31 การเรียงลาดับข้อมูลแบบ Bubble Sort
1.32 การเรียงลาดับข้อมูลแบบ Quick Sort
2. ประเภทการเรียงลาดับแบบภายนอก (External)
2.1 วิธกี ารเรียงลาดับแบบผสาน
2.21 การเรียงลาดับข้อมูลแบบ Merge Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
6
ลาดับการจัดเรียง (Sort Order)
ข้อมูลสามารถทีจ่ ะทาการจัดเรียงจากน้อยไปมาก (Ascending)
หรือลาดับจากมากไปน้อย (Descending) ก็ได้ ซึง่ ลาดับการเรียงจะ
ขึน้ อยู่กบั คุณสมบัตขิ องข้อมูลทีจ่ ะนาไปจัดเรียง ตัวอย่างข้อมูลทีเ่ หมาะ
กับการจัดเรียงจากน้อยไปมาก เช่น สมุดโทรศัพท์ พจนานุกรม สาหรับ
การจัดเรียงจากมากไปหาน้อย เช่น เกรดเฉลีย่ สะสมของนักศึกษา หรือ
คะแนนของผู เ้ ล่นเกมส์ ซึง่ มักจะเป็ นสถิตจิ ากลาดับสูงลงมาต่ า เป็ นต้น
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
7
ประสิทธิภาพของการเรียงลาดับข้อมูล (Sort Efficiency)
ประสิทธิภาพของการเรียงลาดับข้อมูล คือ การวัดผลประสิทธิภาพ
เชิงสัมพันธ์ ของการเรียงลาดับข้อมูล ซึง่ โดยปกติแล้ว ได้มกี ารประมาณ
ค่าจากการเปรียบเทียบ และการเคลือ่ นย้ายลาดับเพือ่ จัดเรียงภายใน
ลิสต์ทไี่ ม่ได้เรียงลาดับข้อมูลไว้ โดยในทีน่ จ้ ี ะกล่าวถึงการวัดประสิทธิภาพ
ของการเรียงลาดับข้อมูลแบบภายในเท่านัน้ ซึง่ ประสิทธิภาพของการ
เรียงลาดับข้อมูลของแต่ละอัลกอริทมึ จะใช้แทนสัญลักษณ์บกิ๊ โอ เช่น
ปประสิทธิภาพการจักเรียงข้อมูล O(n) ย่อมดีกว่า O(n2)
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
8
วิธกี ารเรียงลาดับข้อมูล
การเรียงลาดับข้อมูลแบบ Selection Sort
การเรียงลาดับข้อมูลแบบ Selection Sort หรือการเรียงลาดับ
ข้อมูลแบบเลือก ถือว่าเป็ นวิธกี ารเรียงลาดับข้อมูลทีเ่ รียบง่าย
ตรงไปตรงมาวิธหี นึง่ การทางานในแต่ละรอบของวิธนี ้ ี จะทาการค้นหา
หรือสแกนค่าค้นหาตัง่ แต่แรกจนถึงตัวสุดท้าย หลังจากทีไ่ ด้พบ
ตาแหน่งของค่าทีน่ อ้ ยทีส่ ุดแล้วก็จะทาการสลับตาแหน่งกัน จากนัน้ ใน
รอบต่อไป ก็จะขยับตาแหน่งไปยังตัวถัดไป โดยจะทาเช่นนี้ไปเรือ่ ยๆ จน
ครบทุกตัว ก็จะได้ชุดข้อมูลทีจ่ ดั เรียงเรียบร้อยสมบูรณ์
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
9
Wall
…
0
Sorted
Minimum ( a[k] … a[last])
j
k
Last
Unsorted
รูปที่ 9.2 หลักการเรียงลาดับข้อมูลแบบ Selection Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
10
Ex. การเรียงข้อมูลแบบ Selection Sort โดยการใช้หลักเกณฑ์จากรูปที่ 9.2
โดยสมมุตวิ ่ามีขอ้ มูลทีต่ ้องการจัดเรียงดังนี้ {23, 78, 45, 8, 32, 56}
ขัน้ ตอนที่ 1:
เริม่ ต้นจากข้อมูลต้นฉบับ ซึง่ เป็ นชุดตัวเลขทีย่ งั ไม่ผา่ นการจัดเรียงทัง้ หมด โดยให้ทาการค้นหา
ค่าทีน่ อ้ ยทีส่ ุดจากช่องที่ 1 ไปจนถึงช่องที่ 6 ผลทีไ่ ด้คอื 8 หลังจากนัน้ ให้ทาการสลับ
ตาแหน่งกับ 23 และในส่วนของกาแพงก็จะเลือ่ นขยับเข้าไปหนึง่ ตาแหน่ง
23
78
45
8
Unsorted
32
56
8
78
45
23
32
56
Unsorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
11
ขัน้ ตอนที่ 2:
เริม่ ต้นจากช่องที่ 2 คือตัวเลข 78 ไปจนถึงช่องที่ 6 พบค่าน้อยทีส่ ุกคือ 23 ให้ทา
การสลับตาแหน่งระหว่างตัวเลขตัวเลขที่ 78 กับ 23 และในส่วนของกาแพงก็จะเลือ่ นขยับเข้าไป
หนึง่ ตาแหน่ง
8
78
45
23
Unsorted
32
56
8
23
45
Sorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
78
32
56
Unsorted
12
ขัน้ ตอนที่ 3:
เริม่ ต้นจากช่องที่ 3 คือตัวเลข 45 ไปจนถึงช่องที่ 6 พบค่าน้อยทีส่ ุกคือ 32 ให้ทา
การสลับตาแหน่งระหว่างตัวเลขตัวเลขที่ 45 กับ 32 และในส่วนของกาแพงก็จะเลือ่ นขยับเข้าไป
หนึง่ ตาแหน่ง
8
23
Sorted
45
78
32
56
Unsorted
8
23
32
Sorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
78
45
56
Unsorted
13
ขัน้ ตอนที่ 5:
สาหรับรอบนี้ จักเป็ นรอบสุดท้าย เนือ่ งจากภายในลิสต์เหลือเพียงข้อมูลสองตัวสุดท้าย
คือ 78 และ 56 ปรากฏว่าค่า 56 น้อยกว่า จึงทาการสลับตาแหน่งกัน หลังจากนัน้ ก็
คงเหลือไว้แต่เพียงข้อมูลทีไ่ ด้จดั เรียงไว้อย่างสมบูรณ์
8
23
32
Sorted
45
78
56
Unsorted
8
23
32
45
56
78
Sorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
14
Algorithm seleetionSort (list, last)
Sorts list array by selecting smallest element in
unsorted portion of array and exchanging it with element
at the beginning of the unsorted list
Pre
list must contain at least one item
last contains index to last element in the list
Post
list has been rearranged smallest to largest
1
set current to 0
2
loop (until last element sorted)
1 set smallest to current
2 set walker to current + 1
3 loop (walker <= last)
1 if (walker key < smallest key)
1 set smallest to walker
2 increment walker
4 end loop
Smallest selected: exchange with current element.
5 exchange (current, smallest)
6 increment current
3
end loop
end seleetionSort
อัลกอริทมึ ที่ 9.1 Selection Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
15
การเรียงลาดับข้อมูลแบบ Heap Sort
การเรียงลาดับข้อมูลแบบ Heap Sort จะเริม่ ต้นทางานจากอาร์เรย์
ทีม่ จี ดั การเรียงลาดับข้อมูลแบบฮีพ ซึง่ คุณสมบัตสิ าคัญของฮีพทรีก ็
คือ รูทโหนดจะมีค่ามากทีส่ ุด และในการแทนฮีพในอาร์เรย์ ค่าทีม่ ากทีส่ ุด
จะอยู่ทตี่ าแหน่งแรกสลับกับค่าสุดท้ายของฮีพ และจะดาเนินการเช่นนีไ้ ป
จนกระทัง่ ได้จดั การกับข้อมูลทัง้ หมดในฮีพก็จะได้ขอ้ มูลทีจ่ ดั เรียง
เรียบร้อยอย่างสมบูรณ์
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
16
78
[0]
56
32
[1]
[2]
45
8
23
19
78
[3]
[4]
[5]
[6]
[0] [1] [2] [3] [4] [5] [6]
(a) ฮีพทรี
56
32
45
8
23
19
(b) การแทนฮีพทรีในอาร์ เรย์
รูปที่ 9.3 การแทนฮีพทรีในหน่วยความจาด้วยอาร์เรย์
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
17
After heap
After pass 1
and reheap
78
32
56
8
23
45
8
23
78
heap
56
32
45
heap
After pass 2
and reheap
After pass 3
and reheap
After pass 4
and reheap
After pass 5
and reheap
After pass 6
and reheap
45
32
23
sort
8
56
heap
32
8
sort
23
45
heap
23
8
32
78
45
56
78
45
56
78
45
56
78
sort
23
32
heap
8
56
sort
heap
8
78
sort
23
32
sort
รูปที่ 9.4 ขัน้ ตอนการเรียงลาดับข้อมูลแบบ Heap Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
18
Algorithm heapSort (heap, last)
Sort an array, using a heap.
Pre
heap array is filled
last is index to last element in array
Post heap array has been sorted
Create heap
1
set walker to 1
2
loop (heap built)
1 reheapUp (heap, walker)
2 increment walker
3
end loop
Heap created. Now sort it.
4
set sorted to last
5
loop {until all data sorted)
1 exchange (heap, 0, sorted)
2 decrement sorted
3 reheapDown (heap, 0, sorted)
6 end loop
end heapSort
อัลกอริทมึ ที่ 9.2 Heap Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
19
ประสิทธิภาพของอัลกอริทมี การเรียงลาดับข้อมูลแบบ Heap ทีเ่ ขียนอยู่ในรูปแบบ
สัญลักษณ์บกิ โอก็คอื O(nlogn))
n
Number of loops
Selection Sorted
Heap Sorted
25
625
116
100
500
1000
2000
10,000
250,000
1,000,000
4,000,000
664
4,482
9,965
10,965
รูปที่ 9.5 ตารางเปรียบเทียบจานวนรอบการทางานของ Selection Sort และ Heap Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
20
การเรียงลาดับข้อมูลแบบ Insertion Sort
การเรียงลาดับข้อมูลแบบ insertion Sort หรือการเรียงลาดับ
ข้อมูลแบบแทรก จัดเป็ นวิธกี ารเรียงลาดับข้อมูลทีไ่ ม่ซบั ซ้อนเช่นกัน วิธนี ้ ี
เป็ นพืน้ ฐานทางเทคนิคทีน่ าไปใช้ในการเรียงไฟด้วยมือ โดยผู เ้ ล่นจะทา
การจัดเรียงไฟด้วยการดึงไฟทีต่ ้องการออกมาแทรกในตาแหน่งที่
เหมาะสมในช่วงลาดับการเรียงมนขณะนัน้ โดยพิจารณาจากรูปที่ 9.6
ซึง่ เป็ นภาพแสดงหลักการเรียงลาดับข้อมูลแบบ Insertion Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
21
Wall
…
0
…
j
Sorted
k
Last
Unsorted
รูปที่ 9.6 หลักการเรียงลาดับข้อมูลแบบ Insertion Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
22
Ex. การเรียงข้อมูลแบบ Insertion Sort โดยการใช้หลักเกณฑ์จากรูปที่ 9.6
โดยสมมุตวิ ่ามีขอ้ มูลทีต่ ้องการจัดเรียงดังนี้ {23, 78, 45, 8, 32, 56}
ขัน้ ตอนที่ 1:
เริม่ ต้นจากข้อมูลต้นฉบับ ซึง่ เป็ นชุดตัวเลขทีย่ งั ไม่ผา่ นการจัดเรียง กาแพงหรือดรรชนีอยู่ท ี่
ตาแหน่งสมาชิกลาดับที่ 2 ด้วยการเปรียบเทียบค่าตัวเลขช่องที1่ และช่องที่ 2 ผลปรากฏว่า
ช่องที่ 2 คือค่าตัวเลข 78 ซึง่ มีค่ามากกว่า 23 จึงถือว่าเรียงลาดับอยู่แล้ว ดังนัน้ ก็ให้ขยับ
กาแพงหรือดรรชนีไปอีกหนึง่ ตาแหน่ง
23
78
45
8
Unsorted
32
56
23
78
45
Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
8
32
56
Unsorted
23
ขัน้ ตอนที่ 2:
ตาแหน่งดรรชนี ณ ขณะนีข้ ยับไปอยู่หน้าช่องที่ 3ให้ทาการนาค่าตัวเลขจากช่องที่ 3 ไป
เปรียบเทียบกับชุดตัวเลขในส่วนทีจ่ ดั เรียงไว้แล้ว ซึง่ อยู่ส่วนหน้า ผลลัพธ์ทไี่ ด้คอื ค่าตัวเลข 45
จะนาไปแทรกในตาแหน่งที่ 2 ซึง่ อยู่ระหว่างค่า 23 กับ 78
23
Sort
78
45
8
32
56
Unsorted
23
45
78
Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
8
32
56
Unsorted
24
ขัน้ ตอนที่ 3:
ตาแหน่งดรรชนี ณ ขณะนีข้ ยับไปอยู่หน้าช่องที่ 4 ให้ทาการนาค่าตัวเลขจากช่องที่ 4 ไป
เปรียบเทียบกับชุดตัวเลขในส่วนทีจ่ ดั เรียงไว้แล้วทัง้ หมด ค่า 8 จะถูกแทรกไว้ทตี่ าแหน่งแรกใน
ส่วนของข้อมูลทีไ่ ด้จดั เรียง
23
45
Sort
78
8
32
56
Unsorted
8
23
45
Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
78
32
56
Unsorted
25
ขัน้ ตอนที่ 4:
ตาแหน่งถัดไปคือช่องที่ 5 ให้นาค่าตัวเลขจากช่องที่ 5 ซึง่ ในทีน่ ค้ ี อื ค่า 32 ไปเปรียบเทียบกับ
ชุดตัวเลขในส่วนทีจ่ ดั เรียงทัง้ หมด ผลปรากฏว่าค่า 32 ซึง่ อยู่ตาแหน่งที่ 5 นีจ้ ะนาไปแทรกไว้
ทีต่ าแหน่งในส่วนทีไ่ ด้จดั เรียงไว้โดยแทรกไว้หน้าค่า 45
8
23
45
Sort
78
32
56
Unsorted
8
23
32
45
78
56
Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
26
ขัน้ ตอนที่ 5:
รอบนีจ้ ดั เป็ นรอบสุดท้าย โดยขณะนีเ้ หลือเพียงข้อมูลตาแหน่งสุดท้ายเพียงตัวเดียวทีจ่ ะต้อง
นาไปเปรียบเทียบเพือ่ จัดเรียง ผลปรากฏว่า ค่าตัวเลข 56 จะถูกนาไปแทรกไว้ในตาแหน่งที่ 5
หลังจากนัน้ จะได้ชุดตัวเลขทีผ่ า่ นการจัดเรียงแล้วอย่างสมบูรณ์
8
23
32
Sort
45
78
56
8
23
32
45
56
78
Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
27
Algorithm insertionSort (list, last)
Sorts list array using insertion sort. The array is
divided into sorted and unsortsd lists. With each pass, the
first element in the unsorted list is inserted into the sorted list.
Pre list must contain at least one item
last is an index to last element in the list
Post list has been rearranged
1 set current to 1
2 loop (until last element sorted)
1 move current element to hold
2 set walker to current - 1
3 loop (walker >= 0 AND hold key < walker key)
1 move walker element right one element
2 decrement walker
4 end loop
5 move hold to walker + 1 element
6 increment current
3 end loop
end insertionSort
อัลกอริทมึ ที่ 9.3 Insertion Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
28
การเรียงลาดับข้อมูลแบบ Bubble Sort
การเรียงลาดับข้อมูลแบบ Bubble Sort เป็ นการเรียงลาดับข้อมูล
ด้วยการเปรียบเทียบข้อมูลเป็ นคู่ทอี่ ยู่ตดิ กันในแต่ ละรอบการทางาน เพือ่
สลับตาแหน่งกันหากข้อมูลอยู่ผดิ ลาดับ โดยหากเป็ นการจัดเรียงลาดับ
ข้อมูลจากน้อยไปมาก การทางานจะเริม่ จากข้อมูลตัวสุดท้ายภายในลิสต์
และทาการเปรียบเทียบกับค่าถัดไปทีอ่ ยู่ขา้ งหน้าทีอ่ ยู่ตดิ กัน โดยหากตัว
เลขทีอ่ ยู่ท้ายมีค่าน้อยกว่า ก็จะทาการสลับตาแหน่ง (Swap) กับตัว
ก่อนหน้าเพือ่ ขยับลอยเหนือขึน้ ไปเรือ่ ยๆ จนกว่าข้อมูลในลิสต์จะถูก
จัดเรียงทัง้ หมด
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
29
Bubble up
Wall
…
0
…
j
Sorted
k
Last
Unsorted
รูปที่ 9.7 หลักการเรียงลาดับข้อมูลแบบ Bubble Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
30
Ex. การเรียงข้อมูลแบบ Bubble Sort โดยการใช้หลักเกณฑ์จากรูปที่ 9.7
โดยสมมุตวิ ่ามีขอ้ มูลทีต่ ้องการจัดเรียงดังนี้ {23, 78, 45, 8, 56, 32}
รอบที่ 1:
23
78
45
8
56
32
23
78
45
8
32
56
23
78
45
8
32
56
23
78
8
45
32
56
23
8
78
45
32
56
8
23
78
45
32
56
Unsorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
31
รอบที่ 2:
8
23
78
45
32
56
8
23
78
45
32
56
8
23
78
32
45
56
8
23
32
78
32
56
8
23
32
45
32
56
Sorted
Unsorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
32
รอบที่ 3:
รอบที่ 4:
8
23
32
78
45
56
8
23
32
45
78
56
8
23
32
45
78
56
8
23
32
45
56
78
8
23
32
45
78
56
8
23
32
45
56
78
8
23
32
78
32
56
8
23
32
45
56
78
Sorted
Unsorted
Sorted
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
33
Algorithm bubbleSort (list, 'last)
Sort an array using* .bubble sort. Adjacent
elements, are compared gad exchanged until list is completely ordered.
pre list mast contain at least one item
last contains index to last element in the list
Post list has been rearranged in sequence low to high
1
set current to 0
2
set sorted to false
3
loop (current <= last AMD sorted false)
Each iteration is one sort pass.
1 set walker to last
2 set sorted to true
3 loop (walker > current)
1 if (walker data < walker - 1 data)
Any exchange means list is not sorted.
1 set sorted to false
2 exchange- (list, walker, walker - 1}
2 end if
3 decrement walker
4 end loop
5 increment current '
4
end loop
end bubbleSort
อัลกอริทมึ ที่ 9.4 Bubble Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
34
การเรียงลาดับข้อมูลแบบ Quick Sort
การเรียงลาดับข้อมูลแบบ Quick Sort เป็ นการเรียงลาดับข้อมูล
ด้วยการใช้หลักการแบ่งส่วน (Partition) ข้อมูลเป็ นหลัก แต่ละรอบ
ของการทางานจะมีการเลือกอิลเิ มนต์ตวั หนึง่ ทีเ่ รียกว่า Pivot ทีใ่ ช้
สาหรับเป็ นตัวแบ่งแยกส่วนข้อมูล ซึง่ แต่ละส่วนนัน้ อาจจะมีจานวน
อิลเิ มนต์ทไี่ ม่เท่ากันก็ได้ โดยการแบ่งส่วนภายในลิสต์ จะแบ่งออกเป็ น 3
ส่วนด้วยกัน ซึง่ มีประสิทธิภาพมากกว่า เพราะมีจานวนการสลับตาแหน่ง
จะน้อยกว่าการจัดเรียงลาดับแบบ Bubble Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
35
After 1st partition
1. ส่วนทีห่ นึง่ คือกลุม่ อิลเิ มนต์ท ี่
keys < pivot
pivot
keys >= pivot
สมาชิกข้อมูลมีค่าน้อยกว่า pivot key
After 2nd partition
2. ส่วนทีส่ อง คือค่า pivot key ทีใ่ ช้
< pivot rd pivot >= pivot
เป็ นค่าสาหรับแยกส่วนข้อมูล ซึง่ ปกติ
After 3 partition
แล้วตาแหน่งทีเ่ หมาะสมของค่านีจ้ ะอยู่
ระหว่างลิสต์ทมี่ คี ่าน้อยกว่า pivot key <--- Sorted
-->
th
After 4 partition
กับลิสต์ทมี่ คี ่ามากกว่าหรือเท่ากับค่า
pivot key
<-------Sorted -------->
th
After 5 partition
3. ส่วนทีส่ าม คือกลุม่ อิลเิ มนต์ท ี่
สมาชิกข้อมูลมีค่ามากกว่าหรือเท่ากับ
<-------Sorted --------> < pivot pivot >= pivot
th
After 6 partition
ค่าของ pivot key
<------------Sorted ---------------->
th
After 7 partition
<------------------- Sorted ------------------>
รูปที่ 9.8 แสดงการแบ่งส่วนข้อมูลการเรียงลาดับข้อมูลแบบ Quick Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
36
สาหรับอัลกอริทมึ ต้นแบบของการเรียงลาดับข้อมูลแบบ Quick
Sort ทีพ่ ฒั นาโดย Hoare นัน้ ได้มกี ารเลือก Pivot Key ทีต่ าแหน่ง
อิลเิ มนต์แรกของลิสต์ ต่อมาในราวปี ค.ศ. 1969, R.C. Singleton
ได้ทาการปรับปรุงลาดับการเลือกค่า Pivot Key จากค่ากลาง
(median value) ซึง่ ประกอบด้วย 3 อิลเิ มนต์ด้วยกัน คืออิลเิ มนต์
ฝั่ งซ้าย (Left) อิลเิ มนต์ฝั่งขวา (Right) และอิลเิ มนต์ทอี่ ยู่ตรงกลาง
ของลิสต์ การกาหนดค่ากลางภายในลิสต์จงึ ต้องเป็ นไปตามรูปแบบดังนี้
Left element <= middle element <= right element
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
37
Algorithm medianLeft {sortData, left, right)
Find the median value of an array and place it in the first(left) location.
Pre sortData is an array of at least three elements
left and right are the boundaries of the array
Post median value locate and place left
Rearrange sortData so median value is in middle location.
1
set mid to (left + right) /2
2
if (left key > mid key)
1 exchange (sortData, left, mid)
3
end if
4
if (left key > right key)
l exchange (sortData, left, right)
5
end if
6
if {mid key > right key)
1 exchange (sortData, mid, right)
7
end if
Median Is in middle location. Exchange with left.
8
exchange (sortData, left, mid)
end medianLeft
อัลกอริทมึ ที่ 9.5 Median left
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
38
Ex. การเรียงข้อมูลแบบ Quick Sort โดยสมมุตวิ ่ามีชุดตัวเลขทีต่ ้องการนาจัดเรียงดังนี้
{78, 21, 14, 97, 87, 62, 74, 85, 76, 45, 84, 22}
ดังนัน้ ตาแหน่งค่ากึงกลางในลิสต์จากสูตร set mid to (left + right) / 2 จากชุด
ลาดับที่ 1 อัลกอริทมึ ที่ 9.5 จะได้เท่ากับ (1 + 12)/2 ก็คอื ตาแหน่งที่ 6 ดังนัน้ ก็จะได้
Left Key = 78, Mid Key = 62 และ Right Key = 22 แต่ว่าทัง้ สามอิลเิ มนต์นนั้ ยัง
อยู่ในตาแหน่งทีไ่ ม่ถูกต้อง จึงต้องดาเนินการเปรียบเทียบเงือ่ นไขตามอัลกอริทมึ ที่ 9.5 เพือ่ หา
ค่ากึง่ กลางทีถ่ ูกต้องทีแ่ สดงได้ดงั ต่อไปนี้
เมือ่ ได้ตาแหน่ง Left Key, Mid Key และ Right Key
L
78
M
21
14
97
87
62
R
74
85
76
45
84
22
เปรียบเทียบค่า Left Key > Mid Key หรือไม่ ถ้าใช้ให้สลับตาแหน่ง
62
21
14
97
87
78
74
85
76
45
84
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
22
39
เปรียบเทียบค่า Left Key > Right Key หรือไม่ ถ้าใช้ให้สลับตาแหน่ง
22
21
14
97
87
78
74
85
76
45
84
62
เปรียบเทียบค่า Mid Key > Right Key หรือไม่ ถ้าใช้ให้สลับตาแหน่ง
22
21
14
97
87
62
74
85
76
45
84
78
ณ ขณะนีไ้ ด้เป็ นไปตามรูปแบบแล้วคือ
Left element <= middle element <= right element
ซึง่ ก็คอื 22 <= 62 <= 78 จากนัน้ ก็ดาเนินการย้ายตาแหน่ง Pivot Key ไปยังตาแหน่ง
แรกเพือ่ ถือครองไว้ก่อน จนกระทัง่ ได้จดั เรียงและแบ่งลิสต์ได้แล้ว จึงค่อยดาเนินการย้าย
กลับมาในตาแหน่งทีถ่ ูกต้องต่อไป
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
40
Pivot Key
62
21
14
97
87
22
74
85
76
45
84
78
sortLeft
sortRight
ให้สงั เกตตัวชีส้ องตัวซึง่ ประกอบด้วย sortLeft และ sortRight ซึง่ ถูกวางไว้ตาแหน่งต้น
ลิสต์และท้ายลิสต์ โดยตาแหน่ง sortLeft นัน้ จะอยู่ถดั จาก Pivot Key ไปหนึง่ ตาแหน่ง
สาหรับเงือ่ นไขของการดาเนินงานมีดงั นีค้ อื
การเลือ่ นตาแหน่งของ sortLeft และ sortRight
> sortLeft จะเลือ่ นไปทางขวาเรือ่ ยๆ เมือ่ sortLeft มีค่าน้อยกว่า Pivot Key
> sortRight จะเลือ่ นไปทางซ้ายเรือ่ ยๆ เมือ่ sortRight มีค่ามากกว่า Pivot Key
ตัวชีท้ งั้ สองจะหยุดเมือ่
> ค่าของ sortLeft มีค่ามากกว่า Pivot Key
> ค่าของ sortRight มีค่าน้อยกว่า Pivot Key
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
41
โดยเมือ่ เป็ นไปตามเงือ่ นไขข้างต้นแล้วให้ดาเนินการสลับตาแหน่งกัน
Exchange
62
21
14
97
87
22
74
85
76
45
84
78
sortLeft
sortRight
หลังจากนัน้ ตัวชีท้ งั้ สองก็เลือ่ นไปเรือ่ ยๆ ซึง่ เป็ นไปตามเงือ่ นเช่นเดิม จนกระทัง้ หยุดเลือ่ นเมือ่
Exchange
ตรงตามเงือ่ นไข
62
21
14
45
87
22
74
85
76
97
84
78
sortLeft sortRight
และเมือ่ ตัวชี้ sortLeft ได้เลือ่ นมาถึงจุดส่วนทางกับตัวชี้ sortRight แล้ว ถือว่าสิน้ สุดการ
ดาเนินการแล้ว จากนัน้ ย้ายตาแหน่งท้ายลิสต์ฝั่งซ้ายทีเ่ คยเป็ นตาแหน่งของ Pivot Key ซึง่ ก็คอื
22 กลับไว้ตาแหน่งตามเดิม และย้ายตาแหน่งของ Pivot Key กลับมายังตาแหน่งทีถ่ ูกต้อง
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
42
Move
62
21
14
45
22
87
74
85
76
97
84
78
sortRight sortLeft
และท้ายสุดก็จะได้ลสิ ต์ทถี่ ูกแบ่งออกเป็ นสองส่วนด้วยตัวแบ่ง Pivot โดยลิสต์ส่วนแรกจะมีค่า
น้อยกว่า Pivot และลิสต์ส่วนทีส่ องจะมีค่ามากกว่าหรือเท่ากับค่า Pivot ซึง่ ถือว่าแบ่งส่วน
สาเร็จแล้วในรอบแรก
22
21
< pivot
14
45
62
pivot
87
74
85
76
97
84
78
>= pivot
หลังจากทีไ่ ด้นาตาแหน่ง Pivot Key ไปไว้ในตาแหน่งทีถ่ ูกต้องแล้ว ขัน้ ตอนต่อไปก็คอื การใช้
เทคนิคการเรียกตัวเอง (Recursive) ด้วยการเรียกใช้งานฟั งก์ชนั Quick Sort เพือ่
จัดการแบ่งส่วนข้อมูลในรูปแบบเดิมและการจัดเรียงข้อมูลจนเสร็จสมบูรณ์ ดังรูปที่ 9.9
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
43
78
21
14
97
87
62
74
85
76
45
84
22
87
74
85
76
97
62
22
21
14
45
22
14
21
14
84
78
78
45
76
45
74
74
87
97
84
87
87
21
76
84
21
76
84
รูปที่ 9.9 แสดงการแบ่งส่วนข้อมูลการเรียงลาดับข้อมูล
แบบ Quick Sort ซึง่ ใช้เทคนิค Recursive
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
85
97
97
85
85
44
Algorithm quicksort (list, left, right)
An array, list, is sorted using recursion.
Pre
list is an array of data to be sorted
left and right identify the first and last
elements of the list, respectively
Post
list is sorted
1 if ({right - left) > minSize)
Quick sort
1 raedianLeft (list, left, right)
2 set pivot to left element
3 set sortLeft to left + l
4 set sortRight to right
5 loop (sortLeft <= sortRight)
Find key on left that belongs on right
1 loop {sortLeft key < pivot key)
l decrement sortRight
2 end loop
Find key on right that belongs on left
3 loop (sortRight key >= pivot key)
1 decrement sortRight
4 end loop
5 if (sortLeft <«* sortRight)
1 exchange(list, sortLeft, sortRight)
2 increment sortLeft
3 decrement sortRight
6 end if
6 end loop
Prepare for next pass
7 move sortLeft - 1 element to left element
8 move pivot element to sortLeft - 1 element
9 if (left < sortRight)
1 quicksort (list, left, sortRight -1)
10 end if
11 if (sortLeft < right)
1 quicksort (list, sortLeft, right)
12 end if
2 else
1 insertionSort (list, left, right)
3 end if
end quicksort
อัลกอริทมึ ที่ 9.6 Quick Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
45
การเรียงลาดับข้อมูลแบบ Merge Sort
การเรียงลาดับข้อมูลแบบ Merge Sort เป็ นการเรียงลาดับข้อมูลแบบ
ภายนอก หรือการเรียงลาดับข้อมูลแบบผสาน มักจะนาไปใช้งานกับข้อมูลทีม่ ี
ปริมาณมากๆ กล่าวคือข้อมูลทัง้ หมดนัน้ ไม่สามารถนาไปประมวลผลที่
หน่วยความจาหลักในคราวเดียว ดังนัน้ จึงต้องจึงต้องมีการนาข้อมูลบางส่วน
ไปประมวลผลในหน่วยความจาหลัก ในขณะทีข่ อ้ มูลส่วนทีเ่ หลือก็จะถูกจัดเก็บไว้ใน
หน่วยความจาสารอง จากรูปที่ 9.10 แสดงถึงการแบ่งไฟล์ขนาดใหญ่เพือ่
นาไปจัดเรียงข้อมูลแบบ Merge Sort หลังเสร็จสิน้ ระยะการจัดเรียงข้อมูล จะ
ได้ไฟล์ 2 ไฟล์ทผี่ า่ นการจัดเรียงข้อมูลเพือ่ นาไปผสานรวมกัน
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
46
Input file
2,300 recodes
Sort
Merge 1
1-500
Merge 2
1001-1500
2001-2300
501-1000
1501-2000
รูปที่ 9.10 ระยะของการจัดเรียงข้อมูลด้วยวิธกี ารเรียงเรียงข้อมูลแบบ Merge Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
47
การดาเนินงานพืน้ ฐานของการเรียงลาดับข้อมูลแบบ Merge Sort นัน้ เป็ นกระบวนการนา
ไฟล์ขอ้ มูลสองไฟล์ทจี่ ดั เรียงแล้วมารวมกันเพือ่ จัดเรียงข้อมูลตามคีย์ทจี่ ดั เรียง กล่าวคือ เป็ น
การอ่านข้อมูลจาก File-1 และ File-2 และนามาผสานรวมกัน ด้วยการเก็บเอาต์พุตไว้ท ี่
File-3 ซึง่ ดังรูปที่ 9.10
File-1
1
File-2
3
5
4
5
6
8
10
File-3
1
2
3
4
5
6
8
10
รูปที่ 9.10 แสดงการอ่านไฟล์ทงั้ สองและนามาผสานรวมกันเป็ นไฟล์เดียว
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
48
Algorithm mergeFiles
Merge two sorted files into one file,
Pre input files are sorted
Post input files sequentially combined in output file
1
open files
2
read (file1 into recordl)
3
read (file2 into record2)
4
loop (not end filel OR not end file2)
1 if (recordl key <= record2 key)
1 write (recordl to file3)
2 read (file into recordl}
3 if (end of file1)
1 set recordl key to infinity
4 end if
2 else
1 write (record2 to file3)
2 read (file2 into record2)
3 if (end of file2)
1 set record2 key to infinity
4 end if
3 end if
5
end loop
6
close files
end mergeFiles
อัลกอริทมึ ที่ 9.7 Merge Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
49
Ex. การเรียงข้อมูลแบบ Merge Sort โดยสมมุตวิ ่ามีชุดตัวเลขทีต่ ้องการนาจัดเรียงดังนี้
{1, 5, 3, 14, 17, 6, 7, 13}
Distribution Phase 1
1
1
5
3
5
3
14
5
1
3
5
1
14
3
1
3
1
5
3
17
14
3
5
14
7
13
17
6
7
17
6
17
14
6
14
5
6
6
7
7
6
13
13
7
17
6
13
13
7
7
14
13
13
17
17
รูปที่ 9.11 แสดงการเรียงลาดับข้อมูลแบบ Merge Sort
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
50
จากตารางรูปที่ 9.12 จะเปรียบเทียบประสิทธิภาพการจัดเรียงข้อมูลด้วยวิธตี ่างๆ ทัง้ ในกรณีดที สี่ ุด
กรณีเฉลีย่ และกรณีร้ายทีส่ ุด
วิธกี ารเรียงลาดับข้อมูล กรณีดที สี่ ุด (Best-case) กรณีเฉลีย่ (Average-case) กรณีเลยร้ายทีส่ ุด (Worst-case)
Selection Sort
O(n2)
O(n2)
O(n2)
Insertion Sort
O(n)
O(n2)
O(n2)
Bubble Sort
O(n)
O(n2)
O(n2)
Quick Sort
O(nlogn)
O(nlogn)
O(n2)
Merge Sort
O(nlogn)
O(nlogn)
O(nlogn)
รูปที่ 9.12 ตารางเปรียบเทียบประสิทธิภาพการเรียงลาดับข้อมูลด้วยวิธตี ่าง
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122202
51
The End
Lesson 9
วิชาโครงสร้างข้อมูล (Data Structure) รหัส 4122201
52