第10章、资料排序.ppt
《第10章、资料排序.ppt》由会员分享,可在线阅读,更多相关《第10章、资料排序.ppt(62页珍藏版)》请在麦多课文档分享上搜索。
1、1,第10章、資料排序,朝陽科技大學 王淑卿,2,大綱,氣泡浮昇排序法(Bubble Sort) 選擇排序法(Selection Sort) 插入排序法(Insertion Sort) 謝耳排序法(Shell Sort) 快速排序法(Quick Sort) 累堆排序法(Heap Sort) 合併排序法(Merge Sort) 基數排序法(Radix Sort)或稱為筒子排序法(Bucket Sort) 樹排序法 (Tree Sort),3,排序的基本觀念,檔案(File) 記錄(Row或Record) 欄位(Column或Field) 鍵值(Key Value),4,氣泡浮昇排序法(Bubbl
2、e Sort),將N筆記錄(編號0至N-1)按鍵值不遞減次序排序的氣泡浮昇排序法 1.重複步驟2 N-1回合,直到其中有一回合沒有交換情形發生為止2.比較陣列中相鄰兩元素之鍵值,若前面元素大於後面元素,則立刻將兩元素值交換,5,氣泡浮昇排序法(Bubble Sort),氣泡浮昇排序法之每一回合結果,氣泡浮昇排序法之每一回合結果,先定下來的為最大值,6,氣泡浮昇排序法(Bubble Sort),public class BubbleSort /ClassName and FileName:BubbleSortpublic static void main(String args) short s
3、ource = 48,11,9,78,9,20; /sourceshort exchange = 0;for (short pass = 1; pass sourcei + 1) exchange = sourcei; /swapsourcei = sourcei + 1;sourcei + 1 = exchange; / if end /for end /for endfor (short i = 0; i source.length; i+) System.out.print(sourcei + “ “); /show result on screen /main method end /
4、class end,7,選擇排序法(Selection Sort),將N筆記錄(編號1至N)按鍵值不遞減次序排序的選擇排序法為:1. 重複步驟2 N-1回合2.找出第i個至第N個鍵值中的最小者,並將之與第i個鍵值交換。 其中i等於回合數。,選擇排序法的每一回合結果,先定下來的為最小值,8,選擇排序法(Selection Sort),public class Arrays public static void selectionSort(int arr) int smallIndex, tmp; int pass, n = arr.length; / pass has the range 0 t
5、o n-2 for(pass=0; pass=n-2; pass+) smallIndex = pass; for(int i=pass; i=n-1; i+) if(arri=arrpass) smallIndex = i; if(smallIndex!=pass) tmp = arrpass; arrpass = arrsmallIndex; arrsmallIndex = tmp; ,public static void main(String args) / declare an integer array int arr = 87,38,77,38,25,21,1; Arrays.s
6、electionSort(arr); System.out.print(“Sorted: “); for(int i=0; i System.out.print(arri+“ “); ,9,插入排序法(Insertion Sort),將N筆記錄(編號1至N)依鍵值不遞減之次序排序的插入排序法為: 1. 從第2個鍵值至第N個鍵值,分別執行步驟22.將該鍵值插入到其前面所有鍵值當中第一個大於本身的鍵值之前,若沒有大於本身者,則保持原狀並繼續下一回合,插入排序法每一回合排序前,已排序/未排序鍵值分佈,10,插入排序法(Insertion Sort),插入排序法的每一回合結果,11,插入排序法(Ins
7、ertion Sort),輸入:整數陣列data,長度為n 輸出:排序陣列data,若itarget) 9 ,挑定一個target,向前比較,12,謝耳排序法(Shell Sort),將N筆記錄(編號0至N-1)按鍵值不遞減之順序排列之謝耳排序法為: 1. 選擇一適當S值(S最好為質數)2.重複步驟3、4直到S值等於1為止3.將陣列A中的N個鍵值均勻地分成S組且同一組內陣列元素之間距均為 S,分配結果如下:第一組:(A0,AS,A2S,.,A (N-1)/S*S )第二組:(A1 ,AS+1,A2S+1,.,A (N-1)/S*S+1 )第 S組:(AS-1,A2S-1,A3S-1,AN-1)
8、然後,每一分組皆用插入排序法排序之。4.令 S 等於 S 的前一個質數,跳回步驟 2。(註:本步驟只要 S 值遞減即可,不一定要為質數),13,謝耳排序法(Shell Sort),原始記錄鍵值:第一回合,令 S=3,14,謝耳排序法(Shell Sort),第二回合,令 S=S-1=2 最後,令S=1進行插入排序法得到:,15,謝耳排序法(Shell Sort),輸入:整數陣列data,共計n筆資料;ht, ht-1, ., h1(共t組),且h1=1 輸出:排序陣列data,若itarget) 11 12 ,16,快速排序法(Quick Sort),分而治之(Divide and Conqu
9、er) 觀念:將待排序的N個鍵值(編號0至N-1)分成左右兩半,左半邊之鍵值小於第一個鍵值(即a0),而右半邊則大於或等於第一個鍵值,如下圖所示將AL與AJ之鍵值交換,17,快速排序法(Quick Sort),將N筆記錄(編號0至N-1)按鍵值不遞減之順序排列之快速排序法為: 1. 令K=待排序範圍之第一個(最左邊)鍵值。(第一次為A0) 2.由左向右找出一個鍵值Ki,滿足Ki K3.由右向左找出一個鍵值Kj,滿足Kj K 4.若i j則將Ki 與Kj交換,然後跳到步驟2 5.若i j則將K與Kj交換,並以j為基準分割成左右兩半,然後分別針對左右兩半進行步驟1至5,直到左半邊鍵值 = 右半邊鍵
10、值為止,18,快速排序法(Quick Sort),快速排序法(Quick Sort),19,快速排序法(Quick Sort),輸入:整數陣列data,共n筆資料(data0datan-1),datan=MaxInt 輸出:排序陣列data,若ij,則dataidataj,0i,jn-1 1 void QuickSort (int data, int left, int right) 2 int i,j; 3 if (leftright) 4 i = left+1; 5 j = right; 6 target = dataleft; 7 do 8 while (dataitarget) i+;
11、 9 while (dataj=target) j+; 10 if(ij) swap(datai, dataj) 11 while (ij) 12 swap(dataleft,dataj) 13 QuickSort(data, left, j-1); 14 QuickSort(data, j+1, right); 15 16 ,20,堆積排序法(Heap Sort),堆積排序法(Heap Sort) 完整二元樹(Complete Binary Tree)1.是一個二元樹2.先有左子樹再有右子樹3.從樹根節點到每一個樹葉節點之路徑所經過之節點個數頂多差 1堆積樹(Heap Tree) 1.堆積樹
12、除了是一個完整二元樹2.每一個節點之鍵值大於或等於其子節點之鍵值3.因此樹根節點之鍵值是堆積樹中之最大者,21,堆積排序法(Heap Sort),將N筆記錄鍵值K0,K1,K2,KN-1,依鍵值由大到小不遞增之順序排列之堆積排序法為: 1.將K0,K1,K2,KN-1,轉換成完整二元樹 2.將完整二元樹轉換成堆積樹3.輸出樹根鍵值4.將樹中最後一個節點搬到樹根5.重複步驟2、3、4直到輸出所有鍵值為止,22,堆積排序法(Heap Sort),將鍵值 51,67,5,21,78,35,21+,1 按鍵值不遞增排序之堆積排序過程如下: 1.將鍵值轉換成完整二元樹2.將完整二元樹轉換成堆積樹,23,
13、堆積排序法(Heap Sort),24,堆積排序法(Heap Sort),3.輸出樹根鍵值4.將樹中最後一個節點搬到樹根5.重複步驟2、3、4直到輸出所有鍵值為止,25,堆積排序法(Heap Sort),26,堆積排序法(Heap Sort),27,堆積排序法(Heap Sort),28,堆積排序法(Heap Sort),演算法:傳出最小元素,更新最小堆積 輸入:整數陣列datas,datas+1,.,datat恰為最小堆積 輸出:傳出datas、並刪除之,剩下的ts筆資料存至datas,datas+1,.,datat-1中,且必須使成最小堆積1 void restore (int s, in
14、t t) 2 int x = datas; 3 int i=s, j; 4 datas = datat; 5 while (i=t/2) 6 if (data(2*i)data(2*i1) 7 j=2*i; 8 else 9 j=2*i1; 10 swap(datai, dataj); 11 i = j; 12 13,29,堆積排序法(Heap Sort),堆積排序 輸入:整數陣列data,共n筆資料(data0datan-1) 輸出:排序陣列data,若ij,則dataidataj,0i,jn-1 1 for (i=(n-1)/2; i=1; i-) do 2 restore(i, n);
15、3 for (i=n; i=1; i+)do; 4 輸出 data1; 5 data1 = datai; 6 restore(1, i-1); 7 ,30,合併排序法(Merge Sort),是一個典型的分而治之方法 將N筆記錄依鍵值不遞減順序排序之方法為:1.將N個長度為1的鍵值成對地合併成N/2個長度為2的鍵值組2.將N/2個長度為2的鍵值組成對地合併成N/4個長度為4的鍵值組3.將鍵值組成對地合併,直到合併成1組長度為N的鍵值組為止,31,合併排序法(Merge Sort),將鍵值 2,14,8,21,8+,37,89 按鍵值不遞減順序排序之合併排序法的三個回合如下:,32,演算法:合併
16、兩個已排序的數列 輸入:已排序陣列A,共m筆資料;已排序陣列B,共n筆資料 輸出:排序陣列C,若ij,則CiCj,0i,jm+n-11 void merge(int C, int k, int A, int i, int m, int B, int j, int n) 2 while (i=m) 10 ,合併排序法(Merge Sort),33,演算法:合併排序(遞迴版) 輸入:data陣列共計n筆資料 輸出:排序陣列data,若ij則dataidataj,0i,jn-11 int k=0; datan; 2 void merge_sort(int A, int left, int right
17、) 3 int i, j, k, m 4 if (leftright) 5 m = (left+right)/2; 6 merge_sort(A, left, m); 7 merge_sort(A, m+1, right); 8 merge(A, left, A, left, m, A, m+1, m) 9 10 11 main() 12 read_input_data(data, n); 13 merge_sort(data, 0, n-1); 14 ,合併排序法(Merge Sort),34,演算法:合併排序(非遞迴版) 輸入:data陣列共計n筆資料 輸出:排序陣列data,若ij,則d
18、ataidataj,0i,jn-1 1 main() 2 int len=2; 3 while (lenn) 4 for (i=0; in; i+=len) 5 merge(A,i,A,i,i+len/2-1,A,i+len/2,i+len/2-1); 6 len *= 2; 7 8 ,合併排序法(Merge Sort),35,基數排序法(Radix Sort),又稱多鍵排序(Multi-Key Sort)、箱子排序法(Bucket Sort)最有效鍵優先(Most Significant Digit First:MSD)1. 從最左邊的位數開始比較2. 是採用分配、排序、收集等三個步驟進行最
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 资料 排序 PPT
