data structure lesson13

Page 1

!"#

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา ผศ.รุง ระพี กรานคํายี รายละเอียดของเนือ้ หา ตอนที่ 13.1 การเรียงลําดับแบบควิก (1 คาบ) เรือ่ งที่ 13.1.1

การเรียงลําดับแบบควิก (Quick Sort)

เรือ่ งที่ 13.1.2

ประสิทธิภาพของการเรียงลําดับแบบควิก

เรือ่ งที่ 13.1.3

ตัวอยางโปรแกรมการเรียงลําดับแบบควิก

ตอนที่ 13.2 การเรียงลําดับแบบฮีพ (2 คาบ) เรือ่ งที่ 13.2.1

การเรียงลําดับแบบฮีพ (Heap Sort)

เรือ่ งที่ 13.2.2

ประสิทธิภาพของการเรียงลําดับแบบฮีพ

เรือ่ งที่ 13.2.3

ขั้นตอนการเรียงลําดับขอมูลแบบฮีพ

เรือ่ งที่ 13.2.4

สรุปประสิทธิภาพการเรียงลําดับขอมูลแบบตางๆ

แนวคิด 1. การเรียงลําดับแบบควิก ใชหลักการแบงขอมูลเปนกลุมยอย โดยการคัดเลือกขอมูลมาหนึ่งตัว เปนเกณฑในการแบงเปนสองกลุม ยอย ซึ่งกลุมหนึ่งมีคานอยกวาตัวแบงกลุม อีกกลุมมีคา มากกวาตัวแบงกลุม แลวดําเนินการแบบเดียวกันในแตละกลุม ยอย ลงไปเปนลําดับ จนถึง หนวยยอยสุดของทุกกลุม จะไดขอมูลที่เรียงลําดับ 2. การเรียงลําดับแบบควิก (Quick Sort) ใชวิธีการแบบรีเคอรชัน (Recursion) มาชวยในการ เขียนโปรแกรม ชวยใหสามารถเขียนโปรแกรมไดงาย 3. การเรียงลําดับแบบฮีพ (Heap Sort) ใชแนวคิดจาก โครงสรางขอมูลแบบฮีพ ซึง่ เปนไบนารีท รีแบบพิเศษ คือเปนไบนารีทรีแบบสมบูรณ ซึ่งมีโหนดรากที่มีคามากกวาโหนดลูก มาชวยใน การเรียงลําดับ 4. จากขอดีที่รูปรางของฮีพจะประกันวามีโครงสรางเปนไบนารีทรีที่มีความสูงนอยที่สุด ตาม สมบัติของไบนารีทรีแบบสมบูรณ ทําใหการเปรียบเทียบในแตละรอบไมเกิน O(log2N) เทา นัน้ ซึ่งชวยประกันประสิทธิภาพในการเรียงลําดับขอมูล 5. การเรียงลําดับขอมูลสามารถกระทําไดหลายวิธี แตอาจมีประสิทธิภาพแตกตางกัน


!$% 6. ปจจัยสําคัญที่นํามาพิจารณาประสิทธิภาพของขั้นตอนวิธี ไดแก ฟงชันบิ๊กโอ (function Oh) 7. ปจจัยที่นํามาพิจารณาประกอบอีกอยางหนึ่งคือ ลักษณะของขอมูลเขา ซึ่งมีผลตอเวลาที่ใช ในการทํางานดวย ไดแกกรณี ขอมูลเรียงลําดับอยูแ ลว (Best Case), ขอมูลเรียงสลับลําดับ (Worst Case) และ ขอมูลแบบสุม (Random) วัตถุประสงค หลังจากศึกษาบทเรียนที่ 13 แลว นักศึกษาสามารถ 1. 2. 3. 4.

อธิบายขัน้ ตอนการทํางานของการเรียงลําดับแบบควิกได อธิบายขั้นตอนการทํางานของการเรียงลําดับแบบฮีพได วิเคราะหประสิทธิภาพของขั้นตอนวิธีดวยฟงกชันบิ๊กโอ เปรียบเทียบประสิทธิภาพของขั้นตอนวิธีดวยฟงกชันบิ๊กโอ

กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 7.1 และตอนที่ 7.2 2. ทํากิจกรรมของบทเรียนที่ 7 3. ทําแบบประเมินผลของบทเรียนที่ 7 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน


!$& ตอนที่ 13.1 การเรียงลําดับแบบควิก หัวเรื่อง เรือ่ งที่ 13.1.1 การเรียงลําดับแบบควิก (Quick Sort) เรือ่ งที่ 13.1.2 ประสิทธิภาพของการเรียงลําดับแบบควิก เรือ่ งที่ 13.1.3 ตัวอยางโปรแกรมการเรียงลําดับแบบควิก แนวคิด 1. การเรียงลําดับแบบควิก เลือกขอมูลหนึง่ ตัวมาเปนเกณฑในการแบงขอมูลออกเปนสองกลุม ยอย โดยกลุมหนึ่งมีคานอยกวาหรือเทากับขอมูลที่ใชเปนตัวแบง กลุมหนึ่งมีคามากกวาหรือ เทากับขอมูลที่ใชเปนตัวแบง 2. นําแตละกลุมยอยมาทําการแบงยอยลงไปอีกดวยวิธีการแบบเดียวกัน จนกระทัง่ แตละกลุม ยอยไมสามารถแบงไดอีก (มีขอมูลเพียงคาเดียว) จึงสิน้ สุด และไดคา ทีเ่ รียงลําดับ 3. สามารถใชเทคนิคแบบรีเคอรชันมาใช ชวยใหเขียนโปรแกรมไดงาย วัตถุประสงค หลังจากที่ศึกษาตอนที่ 13.1 แลว นักศึกษาสามารถ 1. สามารถอธิบายวิธกี ารเรียงลําดับแบบควิกได 2. สามารถประยุกตขน้ั ตอนการเรียงลําดับแบบควิก สําหรับการเรียงลําดับขอมูลทีเ่ ก็บแบบ ระเบียน ใหเรียงตามลําดับของคียที่กําหนดได 3. สามารถพิจารณาถึงประสิทธิภาพของการเรียงลําดับแบบควิกได เรื่องที่ 13.1.1 การเรียงลําดับแบบควิก การเรียงลําดับแบบควิก (Quick Sort) เปนวิธกี ารเรียงลําดับขอมูลที่ใชหลักเกณฑการสลับคา และ จัดวาเปนวิธีที่มีประสิทธิภาพดีที่สุด การทํางานของวิธีนี้จะใชการจัดกลุมขอมูล โดยกําหนดขอมูลตัวหนึ่งเปน ตัวแบงกลุม สมมติใหเปน a[k] เพื่อใหคาขอมูลอยูในรูป a[1] a[2] … a[m]

a[m+1] a[m+2] … a[N]

โดยที่

a[1] a[2] … a[m]

<= a[k]

และ

a[m+1] a[m+2] … a[N] >= a[k]


!$! เมื่อจัดกลุมขอมูลไดดังรูปแลว ขอมูลในแตละกลุมก็จะนําไปจัดกลุมก็จะนําไปจัดกลุมดวยวิธีการ แบบเดิมอีก และกระทําไปจนกระทั่งไมสามารถแบงกลุมยอยไดอีก ก็จะสิน้ สุดการทํางาน ซึ่งเปนทํางานแบบรี เคอรชนั การกําหนดขอมูลที่เปนตัวแบงกลุม หรือ a[k] อาจทําไดหลายวิธี เชน ใชขอมูลตัวแรกของกลุมมา เป น ตั ว แบ ง ใช ตั ว กลางเป น ตั ว แบ ง หรื อ เลื อ กตั ว หนึ่ ง ตั ว ใดก็ ไ ด ในที่ นี้ ใ ช ตั ว กลางคื อ k = (l+r) / 2 เมื่อ l : ตําแหนงสมาชิกตัวแรก และ r : ตําแหนงสมาชิกตัวสุดทาย วิธีการจัดกลุมใชการคนสมาชิกทางซายของ a[k] ซึ่งมีคามากกวา a[k] และสมาชิกทางขวาของ a[k] ที่มีคานอยกวา a[k] แลวนํามาสลับทีก่ นั ดังนี้

i

j

l

r

a[1]

a[k] a[i]>a[k]

a[n] a[i]<a[k]

สลับคา

สลับคา a[i] a[ j ] เมื่อพบ a[i] > a[k] และ a[ j ] < a[k] และหยุดการทํางานเมื่อ i > j ผลการ จัดกลุมจะไดขอมูล 2 กลุม ดังนี้

l

j

ขอมูล <= a[k]

i ขอมูล => a[k]

ถา j > l ใหนําขอมูล a[ l ]…a[ j ] ไปจัดเรียงดวยวิธีเดิม ถา i < r ใหนําขอมูล a[ i ]…a[ r ] ไปจัดเรียงดวยวิธีเดิม

r


!$" ชัน้ ตอนการทํางานของการเรียงลําดับแบบควิก แสดงดวยโปรซิเจอร QuickSort ดังรูป 13.2 Procedure QuickSort (Var a : List ; Lo,Hi : Integer); {…………………….sort………………….} procedure sort ( l , r : Integer) ; Var i , j , k : Integer ; x , y : Dataitem ; Begin i := l ; j := r ; k := (l + r) DIV 2 ; x := a[k] ; Repeat While a[i] < x Do i := i + 1 ; While a[i] < x Do j := j - 1 ; If i <= j Then Begin y := a[ i ] ; a[ i ] := a[ j ] ; a[ j ] := y ; i := i + 1 ; j := j – 1 End Until i > j ; If i < j Then sort (l , j) ; If i < r Then sort (i , r) End ; {sort} {………………………………..} Begin {quicksort} sort (Lo,Hi) End ;

โปรแกรม 13.1 การเรียงลําดับแบบควิก กิจกรรมที่ 13.1 ทดลองการเรียงลําดับแบบควิก ทดลองเรียงลําดับขอมูลแบบควิกตามขั้นตอนการทํางานในรูป 13.2 จากขอมูลตัวอยางตอไปนี้ (ก) 15

33 26 69 89 61

(ข)

15 26 33 61 69 89

(ค)

89 69

61 33 26 15

กิจกรรมที่ 13.2 หาประสิทธิภาพการเรียงลําดับ สังเกตผลการเรียงลําดับจากกิจกรรมที่ 13.1 สิทธิภาพในการเรียงลําดับหรือไม อยางไร

ทานคิดวาลักษณะลําดับของขอมูลเขามีผลตอประ


!$$ เรื่องที่ 13.1.2 ประสิทธิภาพของการเรียงลําดับแบบควิก พิจารณาจํานวนครั้งของการเปรียบเทียบ = N+2(N/2)+4(N/4)+8(N/8)+…+N(N/N) ซึ่งมี log2 N เทอม ดังนัน้ จํานวนครัง้ การเปรียบเทียบเทากับ N(log2N) หรือมีประสิทธิภาพเปน 0(N log2N) การเลือกตัวแบงกลุมจากตัวอยางขางตนใชตัวกลางของกลุมขอมูล ซึ่งอาจใชวิธีอื่นๆในการเลือกตัว แบงกลุมก็ได ในบางตัวอยางอาจเลือกจากขอมูลตัวแรกของกลุม ในวิธีนี้อาจมีผลใหประสิทธิภาพการทํางาน เปลี่ยนแปลงไปตามลักษณะของขอมูลเขา โดยเฉพาะเมื่อขอมูลเขาเรียงลําดับอยูแลวทําใหแทนที่จะแบงกลุม ใหเปนสองสวนทีม่ ขี นาดใกลเคียงกัน กลับทําใหแบงเปนกลุมฝงเดียวซึ่งมีคามากกวาตัวแบงกลุม ในลักษณะ นีจ้ ะไดประสิทธิภาพการทํางานเปน O(N2) ตารางตอไปนี้แสดงเวลาที่ใชในการเรียงลําดับขอมูล เพื่อเปรียบเทียบประสิทธิภาพการเรียงลําดับ แตละแบบ เมื่อจํานวนขอมูลเพิ่มขึ้น และเมื่อขอมูลเขามีลักษณะแตกตางกัน ตาราง 13.1 เปรียบเทียบเวลาการเรียงลําดับขอมูลแบบตางๆ จํานวนขอมูล = 256 การเรียงลําดับ

ลักษณะเขามูลนําเขา เรียงลําดับแลว

สุม

เรียงสลับลําดับ

แบบฟอง

1.26

2.04

2.80

แบบแทรก

0.20

0.82

1.64

แบบคัดเลือก

0.94

0.96

1.18

แบบควิก

0.08

0.12

0.08

จํานวนขอมูล = 2048 การเรียงลําดับ แบบฟอง

ลักษณะขอมูลเขา เรียงลําดับแลว

สุม

เรียงสลับลําดับ

80.18

128.84

178.66

แบบแทรก

0.22

50.74

103.80

แบบคัดเลือก

58.18

58.34

73.46

0.72

1.22

0.76

แบบควิก


!$' เรื่องที่ 13.1.3 ตัวอยางโปรแกรม ตัวอยาง 13.1 โปรแกรม Quick Sort Demo โปรแกรม Quick_Sort_Demo แสดงการเรียงลําดับแบบควิก โปรแกรมนี้สรางขอมูลทดสอบโดยใช ฟงกชนั เลขสุม สรางเลขจํานวนเต็มซึ่งมีคาระหวาง 0 ถึง 100 และใหผูใชระบุจํานวนขอมูลทดสอบ แสดงขอ มูลทดสอบและผลการเรียงลําดับบนจอภาพ Program Quick_Sort_Demo ; {$R-,S-} Uses Crt ; { This program. demonstrates the quicksort algorithm, which } { provides. an extremely efficient method of sorting arrays in } { memory. The program generates a list of random numbers } { between 0 and 100, and then sorts them using the QUICKSORT } { procedure. Finally, the sorted list is output on the screen. } { Note that stack and range checks are turn off (through the } { compiler directive above) to optimize execution speed. } Const Max = 1,000 ; Type

DataItem = Integer ; List = Array[1..Max] of DataItem ; Var data : List ; i ,num : Integer; ch : Char ; {……………………………………………………………..} Procedure Quicksort (Var a:List; Lo, Hi : Integer) ; Procedure Sort (l,r : Integer) ; Var i , j : Integer ; x,y : DataItem ; Begin i := l , j := r ; x := a[(l+r) DIV 2] ; Repeat While a[i] < x Do i := i + 1 ; While x < a[ j ] Do j := j -1 ; If i <= j Then Begin y := a[i] ; a[i] := a[ j ] ; a[ j ] := y ; i := i + 1 ; j := j – 1 End ; Until i>j ; If l < j Then Sort (l , j) ; If i < r Then Sort (i , r) ; End ; {Sort} Begin


!$( Sort (Lo , Hi) ; End ; {Quicksort} {--------------------------------------------------------------------------} Begin {Main} Clrscr ; Writeln( ‘*** QUICK SORT ***’ : 40) ; Writeln ; Write (‘Enter number of test data : ’ ) ; ReadIn (num) ; Writeln ; Writeln( ‘Generating ‘,num,’ random numbers…’ ) ; Writeln ; Randomize ; For i := 1 to num Do Begin Data[i] := Random(100) ; Write(data[i] : 5) End ; Writeln ; Writeln( ‘Sorting random numbers…’ ) ; Quicksort (data, 1, num) ; Writeln ; For i := 1 to num Do Write (data[i]) ; Writeln ; Writeln ; Writeln( ‘Press Any Key…’) ; ch := Readkey Writeln End.

โปรแกรม 13.2 โปรแกรม Quick_Sort_Demo ตัวอยางการทํางานของโปรแกรม Quick_Sort_Demo *** QUICK SORT ***

Enter number of test data : 15 Gerating 15 random numbers… 89 33 89 69 26 61 79 75 Sorting random numbers… 14 15 26 33 43 49 97 99 Press Any Key…_

43

99

49

89

15

97

14

61

69

75

79

89

89

89


!$) กิจกรรมที่ 13.3

ทดสอบโปรแกรมตัวอยางที่ 13.1

ทดสอบโปรแกรมตัวอยางที่ 13.1 โดยลองเปลีย่ นจํานวนขอมูลเปน 30, 50, และ 100 คา ตัวอยาง 13.2 โปรแกรม Phone Sort โปรแกรม Phone_sort เปนตัวอยางสําหรับเรียงสําหรับเรียงลําดับขอมูลในแฟมสุม (Random File) โดยใชการเรียงลําดับแบบควิก การอางอิงถึงขอมูลแตละรายการใชหมายเลขระเบียนในปาสกาลเริ่มตั้ง แต 0, 1, 2,..., n ดังนัน้ จึงดูเสมือนเปนการเรียงลําดับขอมูลแบบแถวลําดับในจานบันทึก ขอมูลแตละระเบียน ในแฟมขอมูลประกอบดวย ชื่อ และ หมายเลขโทรศัพท โปรแกรมนี้จะเรียงลําดับขอมูลในแฟมชื่อ Phone.Dat ซึ่งบันทึกขอมูลไวแลวอยูในจานบันทึก โดย เรียงลําดับขอมูลตามอักขระของชื่อ และผลการเรียงลําดับบันทึกกลับลงบนแฟมเดิม ซึ่งจะเห็นวาขั้นตอนวิธี ยังคงเปนแบบเดิม เพียงแตปรับปรุงคําสั่งสําหรับอางอิงขอมูลในแฟมเล็กนอยเทานั้น Program Phonesort ; Uses Crt ; Type Phone_rec =

Record Name : String [15] ; Phone : String [15]

End ; Str15 = String [15]; Dataitem = Phone_rec ; Datafi = File of Dataitem ; Var P : Dataitem ; Fi : Datafi ; n : integer ; Function Find (Var fb : Datafi ; i : Integer) : Str15 ; Var t : Dataitem Begin i := i – 1 ; {record number begin with 0} Seek (fp , i) ; Read (fp , t) ; Find := t.name {return name of i th person} End ; {Find} Procedure Qsrand (Var fp :Datafi ; count : Integer) ; {---- Recursive Quick Sort ----} Procedure Qs (I , r : Integer) ; Var i, j, k : Integer ; x, y, z : Dataitem ; Begin i := I ; j := r ; k := (I+r) DIV 2 ; Seek (fp, k –1) ; Read (fp, x) ; {get a record} Repeat


!$* While find (fp,i) < x.name Do i := i + 1 ; While find (fp,j) > x.name Do j := j - 1 ; If i < j Then Begin {swap records on disk} Seek (fp, i – 1) ; Read ( fp, y); Seek (fp, j – 1) ; Read ( fp, z); Seek (fp, j – 1) ; Write ( fp, y); Seek (fp, i – 1) ; Write ( fp, z); i := i + 1 ; j = j – 1 ; End ; Until i > j ; If I < j Then Qs (I , j) ; If i < r Then Qs (i , r) End; {Qs} Begin Qs ( 1 , count ) ; End ; {Qsrand} Begin {main} Clrscr ; WriteIn( ‘ *** SORT DATA RECORD IN RANDOM FILE *** ’ ) ; Assign (fi ,’Phone.dat’) ; Reset (fi) ; n := Filesize (fi) ; WriteIn ; WriteIn( ‘Please wait for file sorting’) ; Qsrand (fi,n) ; Ciose (fi) ; WriteIn(‘Now, file is sorted already’) ; WriteIn( ‘ *** List data from file *** ‘); Reset(fi) ; While Not Eof (fi) Do Begin Read( fi , p) ; WriteIn (p.name : 15 , p.phone : 20 ); End ; close(fi) ; End.

โปรแกรม 13.3 โปรแกรม Phone Sort กิจกรรมที่ 13.4

ทดสอบโปรแกรมตัวอยาง 13.2

ทดสอบโปรแกรมตัวอยาง 13.2 โดยในเบื้องตนตองเขียนโปรแกรมเพื่อสรางแฟม Phone.dat เพื่อเก็บขอมูลชื่อและหมายเลขโทรศัพท ใหมีโครงสรางระเบียนตามที่กําหนดกอน แลวนํามาทดสอบและดู ผลการเรียงลําดับขอมูล หมายเหตุ ใหสรางขอมูลทดสอบไมต่ํากวา 20 ระเบียน


!$# ตอนที่ 13.2

การเรียงลําดับแบบฮีพ

หัวเรื่อง เรือ่ งที่ 13.2.1 การเรียงลําดับแบบฮีพ (Heap Sort) เรือ่ งที่ 13.2.2 ประสิทธิภาพของการเรียงลําดับแบบฮีพ แนวคิด 1. การเรียงลําดับแบบฮีพ เปนการนําสมบัติของโครงสรางแบบฮีพ ซึง่ เปนไบนารีทรีแบบพิเศษ และเปนไบนารีทรีแบบสมบูรณ มาชวยในการเรียงลําดับขอมูล 2. โหนดรากของฮีพ จะเก็บคาสูงสุดของขอมูลในฮีพเสมอ จึงใชวิธีถอดโหนดรากของฮีพมาตาม ลําดับ ก็จะไดชุดขอมูลที่เรียงลําดับตามตองการ 3. การถอดรากของฮีพมาแตละครัง้ ตองทําการจัดโครงสรางขอมูลใหม ใหคงสมบัติของฮีพ 4. เนื่องจากฮีพเปน เปนไบนารีทรีแบบสมบูรณ จึงมีจํานวนการสลับคาขอมูลในการปรับฮีพแตละ ครัง้ ไมเกิน log2 N ซึ่งชวยประกันประสิทธิภาพการทํางานของการเรียงลําดับแบบฮีพ วัตถุประสงค หลังจากที่ศึกษาตอนที่ 13.2 แลว นักศึกษาสามารถ 1. สามารถอธิบายวิธีการเรียงลําดับแบบฮีพได 2. สามารถพิจารณาถึงประสิทธิภาพของการเรียงลําดับแบบฮีพได เรื่องที่ 13.2.1 การเรียงลําดับแบบฮีพ (Heap Sort) โครงสรางขอมูลแบบฮีพ (Heap) เปนโครงสรางขอมูลแบบพิเศษของไบนารีทรีที่มีสมบัติเปนไบ นารีทรีแบบสมบูรณ (Complete Binary Tree) ซึ่งคาของโหนดรากจะมากกวาหรือเทากับคาของโหนดลูก เสมอ ดังนัน้ พิจารณาลักษณะของฮีพ จะเห็นวา • ทุกระดับของฮีพจะแตกสาขาออกไปได 2 ทางคือทางซายและทางขวา และตองเปนไบนารีทรี แบบสมบูรณ คือตองมีโหนดในระดับบนครบ 2 ดานกอน จึงจะแตกโหนดระดับลางได • การแตกโหนดตองแตกโหนดดานซายกอนแลวจึงแตกดานขวา • คาของโหนดพอ ตองสูงกวาหรือเทากับโหนดลูก พิจารณารูปตัวอยางของฮีพ


!'%

รูป (ก) ขอมูลในโครงสรางแบบฮีพ

รูป (ข) แทนโครงสรางแบบฮีพดวย Array

รูป 13.3 การแทนขอมูลในโครงสรางแบบฮีพ

กิจกรรมที่ 13.5 จากรูปตอไปนี้ พิจารณาวารูปใดไมใชฮีพ

(ก)

(ข)

(ค)

กิจกรรมที่ 13.6 แทนรูปฮีพในกิจกรรมที่ 13.5 ดวย array ในโครงสรางแบบฮีพ คาขอมูลสูงสุดเก็บที่โหนดรากของฮีพเสมอ เราจึงสามารถนําสมบัตดิ งั กลาว มาชวยในการเรียงลําดับขอมูล โดยใชวิธีการดังนี้


!'& 1. ถอดโหนดราก (คาสูงสุด) ออกจากฮีพ นําไปวางลงในที่เก็บขอมูลตามลําดับคา 2. ปรับโครงสรางฮีพใหม 3. ทําซ้ําจากขั้นตอนที่ 1 จนหมดสมาชิกในฮีพ การเรียงลําดับดวยวิธนี ้ี จะคลายกับวิธี Selection Sort ในแงที่เลือกหยิบคามากที่สุดหรือนอยที่ สุดจากชุดขอมูลทีเ่ หลืออยูม าวางเรียงกันเปนลําดับ แตการเปรียบเทียบในการปรับโครงสรางของฮีพ ซึง่ ประกันวา เปนไบนารีทรีที่มีความสูงนอยที่สุดแตละครั้งจะไมเกิน O(log2N) จึงใชเวลานอยกวา Selection Sort ซึง่ ตองทําการเปรียบเทียบในแตละรอบเปน O(N) การจัดเรียงขอมูลในฮีพ จะดําเนินการโดย 4. สลับคาของโหนดรากซึง่ เปนคาสูงสุด กับคาในโหนดสุดทายของฮีพ (ถือวาโหนดสุดทายนี้ ไมอยูในฮีพแลว) 5. ปรับโครงสรางของฮีพใหมใหถูกตอง 6. ดําเนินการซ้าํ จนกระทั่งหมดขอมูลในฮีพ

ขอมูลเริม่ ตนของฮีพ 1. สลับคาโหนดราก คือ 100 กับคาโหนดสุดทายคือ 7

ปรับฮีพ

2. สลับ 36 กับ 2

ปรับฮีพ


!'! 3. สลับ 25 กับ 1

ปรับฮีพ

4. สลับ 19 กับ 2

ปรับฮีพ

5. สลับ 17 กับ 2

ปรับฮีพ

6. สลับ 7 กับ 1

ปรับฮีพ

7. สลับ 3 กับ 2


!'"

ปรับฮีพ

8. สลับ 2 กับ 1

เหลือโหนดเดียวไมตองปรับฮีพ

สิน้ สุดการทํางาน ขอมูลเรียงลําดับแลว

ภาพประกอบ 13.1 การเรียงลําดับแบบฮีพ เราสามารถแทนโครงสรางของฮีพดวย Array ดังตัวอยางในรูป 13.3 (ข) วิธีการเรียงลําดับแบบฮีพ โดยแทนฮีพดวย Array แสดงในรูป 13. 5

ฮีพเริ่มตน 1. สลับ 100 กับ 7 ปรับฮีพ 2. สลับ 36 กับ 2

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

100

19

36

17

3

25

1

2

7

7

19

36

17

3

25

1

2

100

36

19

25

17

3

7

1

2

100

2

19

25

17

3

7

1

36

100


!'$ ปรับฮีพ 3. สลับ 25 กับ 1 ปรับฮีพ 4. สลับ 19 กับ 2 ปรับฮีพ 5. สลับ 17 กับ 2 ปรับฮีพ 6. สลับ 7 กับ 1 ปรับฮีพ 7. สลับ 3 กับ 2 ปรับฮีพ 8. สลับ 2 กับ 1 ปรับฮีพ สิน้ สุดการเรียงลําดับ

25

19

7

17

3

2

1

36

100

1

19

7

17

3

2

25

36

100

19

17

7

1

3

2

25

36

100

2

17

7

1

3

19

25

36

100

17

3

7

1

2

19

25

36

100

2

3

7

1

17

19

25

36

100

7

3

2

1

17

19

25

36

100

1

3

2

7

17

19

25

36

100

3

1

2

7

17

19

25

36

100

2

1

3

7

17

19

25

36

100

2

1

3

7

17

19

25

36

100

1

2

3

7

17

19

25

36

100

1

2

3

7

17

19

25

36

100

1

2

3

7

17

19

25

36

100

ภาพประกอบ 13.2 การเรียงลําดับแบบฮีพโดยใช Array กิจกรรมที่ 13.7 เรียงลําดับขอมูลที่อยูในฮีพตอไปนี้

กิจกรรมที่ 13.8 เรียงลําดับขอมูลจากฮีพของกิจกรรมที่ 13.7 โดยแทนฮีพดวย array


!'' เรื่องที่ 13.2.2 ประสิทธิภาพของการเรียงลําดับแบบฮีพ ประสิทธิภาพการทํางานของการเรียงลําดับขอมูลแบบฮีพ จะไมมีประสิทธิภาพมากนัก เมื่อมีขอมูล ปริมาณนอย แตถาหากมีขอมูลปริมาณมากวิธีการนี้นับวาเปนวิธีที่มีประสิทธิภาพดี พิจารณาขัน้ ตอนการทํางาน • ประกอบดวยการทํางานวนซ้าํ N-1 รอบ ในแตละรอบมีการสลับที่ และปรับฮีพ • การสลับที่ แตละรอบกระทําเพียง 1 ครัง้ O(1) • การปรับฮีพ จากการที่ตองถอดคาของโหนดรากลงมา และจัดลําดับคาคียของฮีพใหม โครง สรางของฮีพที่มี N โหนด มีจํานวนระดับเทากับ log2 (N + 1) ดังนั้นจํานวนครั้งที่ตองมีการ สลับคาของขอมูลในการปรับฮีพแตละรอบ ไมเกิน log2 N ดังนั้นในการปรับฮีพมีคาบิ๊กโอเปน O(log2 N) ดังนัน้ เมือ่ คูณกับจํานวนรอบการทํางานทัง้ สิน้ N-1 รอบ ซึง่ เปน O(N) จะไดจํานวนการทํางานซ้ํา เปน O(N log2 N) เรื่องที่ 13.2.3 ขั้นตอนการเรียงลําดับขอมูลแบบฮีพ ขั้นตอนการทํางานของโปรแกรมเรียงลําดับขอมูลแบบฮีพ เริ่มจากขอมูลเขาอยูใน Array ขอมูลจะ ถูกดําเนินการทีละตัวจากโหนดรากของฮีพ (ขอมูลตัวแรกใน Array) ขอมูลในสวนของฮีพจะลดลงทีละตัวใน แตละรอบ โดยนําไปวางในสวนขอมูลที่จัดเรียงลําดับแลว จนกระทั่งหมดขอมูลในฮีพ ก็สน้ิ สุดการทํางาน ในแตละครั้งที่มีการนําโหนดรากของฮีพออกไป ตองมีการปรับโครงสรางของฮีพใหม (Reheap) (พิจารณารูปตัวอยาง 13.4 และ 13.5 ) ไดแกการนําโหนดลูกทีม่ คี า สูงสุดมาเปนรากแทน เพื่อใหคงสมบัติ ของฮีพ สมมติแทนฮีพดวย array ดังนี้ Const MaxElements Type ArrayType

= 100; =

(*

Maximum possible number of elements *)

Array [1 .. MaxElements] of

ขั้นตอนการปรับฮีพคือ Procedure ReheapDown เปนดังนี้ ReheapDown (HeapElements, Root, Bottom) (* At the start, Root is the index of the node that *) (* (possibly) violates the heap order property. *)

ElementType;


!'( HeapOK ! False While Root node is not a leaf AND NOT HeapOK Calculate MaxChild (the index of the child of the current root node with the larger value) If value of Root node < value of MaxChild node Then Swap value of Root node and MaxChild node Root ! MaxChild Else HeapOK ! True End (* While *)

พารามิเตอร HeapElement คือขอมูลในฮีพ ซึ่งแทนดวย array Root คือดัชนีของ array ที่ชี้โหนดรากของ ฮีพ และ Bottom เปนดัชนีของ array ที่ชี้โหนดทายสุดของฮีพ การหาคา MaxChild ทําไดโดยตรวจสอบวา โหนดรากเปนรากที่มีลูกเพียงหนึ่งโหนดหรือไม ถาใช ก็จะเปนลูกทางฝง ซาย ตามสมบัติของตนไมสมบูรณ มิฉะนั้นตองเปรียบเทียบคาของโหนดลูกทางซายและ ขวา เพื่อหาโหนดที่มีคามากกวา เขียนเปนโปรซิเจอรไดดงั โปรแกรม


!') Procedure

ReHeapDown (Var HeapElements : ArrayType ; Root, Bottom :Integer) ; (* Restores the order property of heaps to the subtree starting at the Root *) (* It is assumed that, on invocation of the procedure, the order property is *) (* violated only by the root node *) Var HeapOK : Boolean; (* The heap repair is finished. *) MaxChild : Integer; (* index of the larger child value *) Begin (* ReheapDown *) HeapOK := False; (* Process until Root value is in its correct place. *) While (Root * 2 <= Bottom) AND NOT HeapOK Do Begin (* Calculate index of the child with the larger value. *) If Root * 2 = Bottom Then (* There is onlyone child node. *) MaxChild := Root * 2 Else (* pick the greater of the two children *) If HeapElements[Root * 2] > (* left child *) HeapElements[Root * 2 + 1] (* right child *) Then MaxChild := Root * 2 Else MaxChild := Root * 2 + 1; (* If the heap property is violated, Swap values *) If HeapElements [Root] < HeapElements [MaxChild] Then Begin (* not yet a heap *) Swap ( HeapElements [Root], HeapElements [MaxChild] ); Root := MaxChild End (* if not a heap *) Else (* already is a heap *) HeapOK := True End (* while *) End; (* ReheapDown *)

โปรแกรม 13.4 โปรแกรมสําหรับทําการปรับฮีพ

การเรียงลําดับขอมูลแบบฮีพใน array จะประกอบดวยการสลับคาโหนดรากกับโหนดสุดทายของฮีพ แลวปรับฮีพ และวนรอบจนหมดขอมูล ซึง่ สามารถเขียนเปนโปรซิเจอรไดดงั โปรแกรม


!'* Procedure HeapSort (Var Data

: ArrayType; NumElements : Integer ); (* Sort the first NumElements values of array Data in ascending order, *) (* using the heapsort algorithm . *) Var NodeIndex : Integer; Begin (* HeapSort *) (* Sort the elements in the heap by swapping the root *) (* (current largest) value with the last unsorted value *) (* then reheaping the remaining part of the array . *) For NodeIndex := NumElements Downto 2 Do Begin Swap (Data [1] , Data [NodeIndex] ); ReheapDown (Data, 1, NodeIndex – 1) End (* For loop *) End; (* HeapSort *)

โปรแกรม 13.5 โปรซิเจอรสาํ หรับทําการเรียงลําดับขอมูลแบบฮีพ จากการเรียงลําดับแบบฮีพในวิธีขางตน เปนการเรียงลําดับโดยที่สมมติใหขอมูลที่เขามาเก็บใน โครงสรางแบบฮีพอยูแลว ถาขอมูลเขาไมไดมีโครงสรางแบบฮีพ ตองเพิ่มขั้นตอนในการจัดโครงสรางของ ฮีพไวกอนเริ่มเรียงลําดับขอมูล กิจกรรมที่ 13.9 เขียนและทดสอบโปรแกรมเพื่อทําการเรียงลําดับขอมูลแบบฮีพ ใหเขียนและทดสอบโปรแกรมเพื่อทําการเรียงลําดับขอมูลแบบฮีพ โดยใชขั้นตอนวิธีจากโปรซิเจอร HeapSort และ ReheapDown โดยใหอานขอมูลของฮีพเขาทางแปนพิมพ และแสดงผลการเรียงลําดับขอมูล บนจอภาพ ตามลําดับการทํางานแตละรอบจนสิน้ สุดการทํางาน เรื่องที่ 13.2.4 สรุปประสิทธิภาพการเรียงลําดับขอมูลแบบตางๆ • การเรียงลําดับขอมูลสามารถกระทําไดหลายวิธี เชนเดียวกับขั้นตอนวิธีในการแกปญหาอื่นๆ ดวยโปรแกรมคอมพิวเตอร การใชขั้นตอนวิธีที่แตกตางกันสามารถใหผลการทํางานเชนเดียว กัน แตอาจมีประสิทธิภาพแตกตางกัน • ปจจัยสําคัญที่นํามาพิจารณาประสิทธิภาพของขั้นตอนวิธี ไดแก เวลาทีใ่ ชในการดําเนินการ เมื่อปริมาณขอมูลมากขึ้น แสดงในรูปของฟงชันบิ๊กโอ (function Oh) การพิจารณาดวย ฟงชัน บิ๊กโอเปนวิธีที่ทําไดงายและเห็นไดชัดเจน สามารถนํามาชวยเปรียบเทียบประสิทธิภาพของขั้น ตอนวิธีไดโดย’งาย ไมตองใชเครื่องมือหรืออุปกรณใดๆ


!'# • ปจจัยที่นํามาพิจารณาประกอบอีกอยางหนึ่งคือ ลักษณะของขอมูลเขา ซึ่งมีผลตอเวลาที่ใชใน การทํางานดวย ไดแกกรณี ขอมูลเรียงลําดับอยูแ ลว (Best Case), ขอมูลเรียงสลับลําดับ (Worst Case) และ ขอมูลแบบสุม (Random) จากวิธีการเรียงลําดับขอมูลแบบตางที่ไดกลาวถึง ทํางานไดดงั ตาราง 13-2

สามารถเปรียบเทียบสรุปประสิทธิภาพการ

ตาราง 13.2 สรุปประสิทธิภาพการเรียงลําดับขอมูลแบบตางๆ

วิธเี รียงลําดับ

เรียงลําดับ

ลักษณะขอมูลเขา แบบสุม

Selection

O(N2)

O(N2)

O(N2)

Bubble

O(N2)

O(N2)

O(N2)

Insertion

O(N)

O(N2)

O(N2)

MergeSort

O(N log N)

O(N log N)

O(N log N)

Quick Sort

O(N log N)

O(N log N)

O(N2) ใชคาแรกเปนตัวแบง

HeapSort

O(N log N)

O(N log N)

O(N log N)

เรียงสลับลําดับ

ตาราง 13.3 ตัวอยางคาของฟงกชันแบบตางๆ ตามคาของ N N

Log2N

N2

N Log2N

N3

2N

1

0

0

1

1

2

2

1

2

4

8

4

4

2

8

16

64

16

8

3

24

64

512

256

16

4

64

256

4,096

65,536

32

5

160

1,024

64

6

384

4,096

262,144

……..

128

7

896

16,384

2,096,152

……..

256

8

2,048

65,536

16,777,216

……..

32,768 2,147,483,648


!(%


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.