บทที่ 8 sort

Download Report

Transcript บทที่ 8 sort

การเรียงข้ อมูล
1. Bubble Sort
2. Insertion Sort
3. Heap Sort
4. Quick Sort
5. Merge Sort
6. Radix Sort
7. Selection Sort
1. Bubble Sort
จะเปรียบเทียบค่ า 2 ค่ าทีต่ ิดกัน
ถ้ า ไม่ อยู่ตามทีเ่ รากาหนด เช่ น จากน้ อยไปมาก หรือ จากมากไปน้ อย
ให้ แลกเปลีย่ นตาแหน่ งของค่ าทั้ง 2 นั้น
เรียงจากมากไปน้ อย แบบ Bubble sort
5
1
2
8
8
9
5
1
2
8
8
9
5
2
1
8
8
9
5
2
1
8
8
9
5
2
8
1
8
9
5
8
2
1
8
9
8
5
2
1
8
9
8
5
2
1
8
9
8
5
2
8
1
9
8
5
8
2
1
9
8
8
5
2
1
9
8
8
5
2
1
9
8
8
5
2
1
9
2. Insertion Sort
ต้ องมีพนื้ ทีห่ น่ วยความจาเพิม่ ขึน้ อีก N ตาแหน่ ง สาหรับเก็บส่ วนที่เรียง
แล้ว เช่ น มี A(1: N) ที่ยังไม่ เรียง เราต้ องใช้ B(1:N) มาช่ วย โดยจะดึงค่ า
จาก A ไปใส่ ไว้ ใน B
หรืออาจจะใช้ Sort in Place คือไม่ ต้องมีหน่ วยความจาเพิม่
J
ส่ วนที่เรี ยงแล้ว I
ส่ วนที่ยงั ไม่เรี ยง
เช่ น 5, 4, 2, 8, 8, 9, 6 ต้ องการเรียงจากน้ อย
ไปมาก
5
4
2
8
8
9
6
5J
4
2
8
8
9
6
4
5J
2
8
8
9
6
2
4
5J
8
8
9
6
2
4
5
8J
8
9
6
2
4
5
8
8J
9
6
2
4
5
8
8
9J
6
2
4
5
6
8
8
9J
3. Heap Sort
การเรียงโดยอาศัยโครงสร้ าง heap
 เป็ นวิธีการเรียงทีด่ ีทสี่ ุ ด
โครงสร้ าง heap คือ รูตโหนด จะมีค่ามากกว่ าด้ านซ้ าย และ ขวา
ขั้นตอนการทา Heap Sort
 สร้ าง Heap ก่อน
ทาการ Output Root Node จะได้ ค่าแรก (ค่ าทีม่ ากทีส่ ุ ด) เรียงจากมาก
ไปน้ อย
ปรับแต่ งต้ นไม้ ทเี่ หลือให้ เป็ น Heap
เช่ น 22, 35,42, 38, 32, 26, 27, 90
22
35
38
42
32
26
27
90
ต้นไม้ที่แทนด้วยตำแหน่งของ Array
ขั้นตอนที่ 1 การสร้ าง Heap
ให้ I เป็ น Pointer ชี้ไปยัง Node ใหม่
ให้ เปรียบเทียบโหนดที่เข้ าไปใหม่ กับ โหนดที่ Root Node
ถ้ า โหนดใหม่ มากกว่ า Root Node ให้ แลกทีก่ นั และเลือ่ น I ไปด้ วย
(กรณี เรียงจากมากไปหาน้ อย)
ถ้ าเรียงจากน้ อยไปมาก ให้ เปรียบเทียบ โหนดใหม่ น้ อยกว่ า Root Node
ให้ แลกทีก่ นั และ เลือ่ น I ไปด้ วย
ทาการเปรียบเทียบไปเรื่อยจนกว่ าจะทาไม่ ได้
Heap Sort
Example : Data -> 22 35 42 38 32 26 27 90
90
22
38
32 26
35
42
42
35
38
57
32 26
22
90
Binary tree ของ Array
Heap Structure
27
Heap Sort
Data -> 22 35 42 38 32 26 27 90
22
35
35
I = 38
22
35
38
32
38
42
22
32 26
35
42
35
38
42
22
42
22
42
I = 42
35
38
22
32 26
27
I
Heap Sort
Data -> 22 35 42 38 32 26 27 90
I=90
42
35
38
22
90
90 I = 90
32 26
35
42
38
27
22
32 26
27
ได้ โครงสร้ าง Heap
90
42
38
22
35
32
26
27
ขั้นตอนที่ 2 การ output
โดยการนาค่ าที่ Root Node ซึ่งตาแหน่ งที่ 1 ในอาร์ เรย์
โดยการแลกทีก่ บั ค่ าสุ ดท้ ายของอาร์ เรย์
ค่ าที่ Output ไปแล้ว แทนด้ วย
Heap Sort
Data -> 22 35 42 38 32 26 27 90
I ปรับแต่งต้นไม้
42
22
Re-Heap
35
38
35
42
22 32 26 27
38 32 26 27
90
35
42
38 32 26 27
22
42
38
35
27
output
38
22 32 26 27
90
90
Re-Heap
90
32
35
22 32 26 42
90
38
90
35
22 I 27 26 42
22 35 42 38 32 26 27 90
จะได้ขอ้ มูลที่เรี ยงแล้ว จำก มำกไปหำน้อย คือ
90 42 38 35 32 27 26 22
67 45 3 7 9
เรียงน้ อยไปมาก
32
6
10
ข้ อมูล 88, 78, 34, 67, 74, 25, 27, 14, 40
1. Bubble Sort น้ อยไปมาก
2. Insertion Sort มากไปน้ อย
3. Heap Sort น้ อยไปมาก
ขั้นที่ 3 การปรับต้ นไม้
ให้ ต้ังค่ า Pointer I ชี้ไปยัง Root Node
ให้ แลกค่ าทีม่ ากทีส่ ุ ดระหว่ าง โหนดซ้ าย กับ โหนดขวา ของ Node I มา
อยู่ตาแหน่ ง I แล้วให้ เลือ่ น Pointer I มาอยู่ตาแหน่ งใหม่ ด้วย
ทาไปเรื่อยๆ จนกว่ าจะทาไม่ ได้
4. Quick Sort
เหมาะกับลิสทีม่ ีขนาดใหญ่ และเป็ นการเรียงข้ อมูลทีใ่ ห้ ค่าเฉลีย่ ของ
เวลาน้ อยทีส่ ุ ด
วิธีการ ให้ A (X1, X2… , Xn ) เป็ นลิสต์ ของค่ าหรือ Record ที่ยงั ไม่ ได้
เรียง เราจะเลือก X1 จากนั้นจะแบ่ งลิสต์ A ออกเป็ น 2 ส่ วนคือ
S1 = ข้ อมูลทีม่ คี ่ าน้ อยกว่ า X1
S2 = ข้ อมูลทีม่ คี ่ ามากกว่ า X1
นั้นคือ { S1} < X1 < {S2} โดยที่ {S1} และ {S2} เป็ นข้ อมูลทีย่ งั ไม่ เรียง

ขั้นตอนการเรียง Quick Sort
1. ใช้ Pointer 2 ตัว คือ F , R
2. เปรียบเทียบ ระหว่ างค่ าทีช่ ี้โดย F และ R (Pointer ที่ชี้ตาแหน่ ง X1
ไม่ ว่าจะเป็ น F, R จะไม่ เป็ นตัวเลือ่ นไปยังตาแหน่ งอืน่ )
3. การเปรียบเทียบจะมีการเลือ่ น F ไปข้ างหน้ า และ R เลือ่ นถอยหลัง
4. การเลือ่ น Pointer
ให้ เลือ่ นตัวทีไ่ ม่ ได้ ชี้ไปยังค่ า X1 หรือ ทีท่ าหน้ าที่ X1 ในการเรียงเทีย่ วนั้น
ถ้ า F และ R พบกันที่ค่า X1 เป็ นการสิ้นสุ ดเทีย่ วนั้น
ฉะนั้นจึงเป็ นการแบ่ งลิสต์ ออกเป็ น 2 ส่ วนโดย ค่ า X1 เป็ นค่ าแบ่ ง
5. ให้ Push ค่ า {S2} ไปไว้ ใน Stack ก่อน
6. ทาการเรียงค่ า {S1} เหมือน 1- 4 ให้ เรียบร้ อยก่อน
7. PoP ค่ า {S2} ขึน้ มาทาการเรียงโดยใช้ 1-4 เหมือนเดิม
จะได้ ข้อมูลทีเ่ รียงแล้ว
เช่ น 27, 15, 22, 37, 11, 59 เรียง น้ อยไปมาก
F
27
15
22
F
27
15
22
22
11
15
F
15
11
15
13
13
15
15
x1
F
11
x2
x3
22
F
22
22
22
37
R
59
11
x5
R
11
x4
37
37
37
F
37
F
27
59
R
27
R
27
37
x6
59
R
27
59
R
27
R
37
59
5
59
11
11
15
15
22
22
11
15
22
(15
11
56 15
25 60 18
48
22 )
50
F
37
F
27
FR
27
27
( 59
80
R
27
37
59
R 59
37
59
37)
59 70 3
5. Merge Sort
เป็ นวิธีเรียงข้ อมูลภายนอก เพราะใช้ เรียงข้ อมูลขนาดใหญ่
วิธีเรียง
 เรียงครั้งละ 2 ค่ า จะได้ กลุ่มย่ อย ของข้ อมูลเป็ น n/2 กลุ่ม แต่ ละกลุ่มมี 2
ค่ า
Merge 2 กลุ่มเข้ าด้ วยกัน จะได้ กลุ่มเรียงแล้ว
เช่ น 44, 33, 11, 55, 77, 90, 40, 60,
99, 22, 88, 66
44
33
11
55
55
77
77
90
90
40
88
11
33
44
55
11
33
44
55
40
60
77
90
22
66
88
99
11
33
40
44
55
60
77
90
22
66
88
99
11
33
40
44
55
60
77
90
22
66
88
99
11
22
33
40
44
55
60
66
77
88
90
99
11
22
33
40
44
55
60
66
77
88
90
99
90
99
66
22
66
66
11
77
22
22
44
60
60
99
33
40
40
60
88
88
99
6. Radix Sort
จะไม่ พจิ ารณาค่ าทีแ่ ท้ จริงของคีย์ จะแยกพิจารณาคีย์ออกเป็ น ทีล่ ะหลัก
วิธีเรียง
เตรียม Bucket ไว้ 10 ถัง
อ่านค่ าข้ อมูลทีล่ ะตัว พิจารณาหลักสู ดท้ ายก่อน
นาข้ อมูลไปเก็บไว้ ตามค่ านั้นๆ
อ่านค่ าหลักต่ อไปจนกว่ าจะครบทุกหลัก
จะได้ ข้อมูลทีเ่ รียงแล้ว
RADIX SORT
Technique :
1.
Start with the ones column of each key and sort all 0s, 1s, 2s, etc into
separate group.
131 41 59 26 53 58 97 93 23 84 16 77 1
01
41
31
ถังข้อมูล
0
1
23
93
53
2
3
84
4
5
(ครัง้ ที่ 1 [หลักหน่ วย])
16
26
77
97
58
59
6
7
8
9
RADIX SORT
2. Arrange the groups in ascending order.
41
31
ถังข้อมูล
0
1
2
23
93
53
84
3
4
5
16
26
77
97
6
7
(ข้อมูลทีไ่ ด้จากครัง้ ที่ 1)
31 41 53 93 23 84 26 16 97 77 58 59
58
8
59
9
RADIX SORT
3.
Repeat this sorting with the 1s, 10s, 100s, 1000s, etc columns.
(ข้อมูลทีไ่ ด้จากครัง้ ที่ 1)
31 41 53 93 23 84 26 16 97 77 58 59
01
16
26
23
ถังข้อมูล
0
1
2
(ข้อมูลทีไ่ ด้จากครัง้ ที่ 2)
31
41
59
58
53
3
4
5
6
77
84
97
93
7
8
9
16 23 26 31 41 53 58 59 77 84 93 97
Sorted data
(ครัง้ ที่ 2 [หลักสิบ])
7. Selection Sort
เป็ นวิธีทงี่ ่ ายทีส่ ุ ด
หาตาแหน่ งข้ อมูลทีม่ ีค่าน้ อยทีส่ ุ ด
สลับตาแหน่ ง key ไปไว้ ในตาแหน่ งที่ 1
นาค่ าตาแหน่ งที่ 1 แทน ณ ข้ อมูลน้ อยทีส่ ุ ด
จะได้ ข้อมูลตาแหน่ งที่ 1 มีค่าน้ อยทีส่ ุ ด
เช่ น 44, 33, 11, 55, 77, 90, 40,
60, 22, 88
44
11
11
11
11
11
11
11
33
33
22
22
22
22
22
22
11
44
44
44
33
33
33
33
55 77 90
55 77 90
55 77 90
55 77 90
55 77 90
55 77 90
40 77 90
40 77 90
40
40
40
40
40
40
55
55
60
60
60
60
60
60
60
60
22
22
33
33
44
44
44
44
88
88
88
88
88
88
88
88
11
11
11
11
11
11
11
11
11
11
22
22
22
22
22
22
22
22
22
22
33
33
33
33
33
33
33
33
33
33
40
40
40
40
40
40
40
40
40
40
77
44
44
44
44
44
44
44
44
44
90 55 60 44
90 55 60 77
90 55 60 77
55 90 60 77
55 90 60 77
55 60 90 77
55 60 90 77
55 60 77 90
55 60 77 90
55 60 77 88
88
88
88
88
88
88
88
88
88
90
ทำส่ งในชั้นเรี ยน
67 45 3 7 191 32 16
40 90 87 771 60 50 29
เรียงน้ อยไปมาก
10
การบ้ าน
56
1
15
4
48
81
50
287
80
59
891
70