- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
快速排序法QuickSort
快速排序法 (Quick Sort) 從待排序的資料中取出一筆資料 ( 通常是第一筆 ) 當作基準值 (Pivot Key),將基準鍵值逐一與其他所有資料作比較後,可以直接將基準鍵值之資料放置於正確位置,且把其他所有的資料分割成兩組子集合: 小於此鍵值的集合 大於此鍵值的集合。 接著便可以再對這兩個子集合分別作快速排序,也就是再從其中分別選出基準鍵值繼續作快速排序。 利用分而治之 (divide and conquer)的精神 快速排序法的運作步驟 假設有n 筆資料要排序,運作步驟如下: 1. 從未排序資料中取出第一筆資料當作基準鍵值p (Pivot Key)。 2. 由前向後找到第一個比 p 大的資料,設此資料的位置為 i。 3. 由後向前找到第一個比 p 小的資料,設此資料的位置為 j。 4. 若 i j ,則將i, j 位置的資料互相交換。 5. 重複步驟2, 3, 4,直到 i j 為止。 6. 將p 與目前位置j 的資料交換 。(則p 已放置於正確位置,且把其他所有的資料分割成兩組子集合,小於p 的資料皆於資料p 的前面,大於p 的資料皆於資料p 的後面。) 7. 對這兩個子集合分別重複步驟1~6,直到每個子集合均只剩下一個元素時,也就完全排序好了。 範例 排序的資料為 23 44 13 30 37 19 10 26,則第一階段的快速排序過程如下: 例﹕ 資料之鍵值為15, 18, 33, 10, 27, 11, 13, 42, 20,請以快速排序法排序,假設以第一筆當作基準鍵值,請寫出排序的過程及其結果。 快速排序法的函數quick_sort( ) 假設有n筆整數資料儲存於整數陣列a中: /*快速排序法:使用遞迴的觀念*/ void quick_sort (int a[], int left, int right) { int key, i, j, temp; if( left right ) { /*當兩筆資料以上才要排序*/ key = a[left]; /*以第一筆當作基準值*/ i = left; /*左端位置*/ j = right; /*右端位置*/ while( ij ) { /*由前向後找第一筆比基準值大的值*/ while ( i right a[i] = key ) i++; /*由後向前找第一筆比基準值小的值*/ while( j left a[j] = key ) j--; if( i j ) { /*若與排序規則不符,將資料交換*/ temp = a[i]; a[i] = a[j]; a[j] = temp; } /*if*/ } /*while*/ temp = a[left]; /*將基準值之資料與目前位置j的資料交換*/ a[left] = a[j]; a[j] = temp; /*使用遞迴,對兩個子集合分別作排序*/ quick_sort( a, left, j-1 ); quick_sort( a, j+1, right ); } } /*quick_sort()*/ * 完成第一階段快速排序 26] 44 30 [37 23 13] 10 [19 因37 23,i = 4 因19 23,j = 3 因 i j,將23與19交換 26 44 30 19? 37 j ??? ???i 13 10 23 因30 23,i = 3 因19 23,j = 5 因 i j,將30與19交換 26 44 19 j 37 30 i 13 10 23 [7] [6] [5] [4] [3] [2] [1] [0] 因44 23,i = 1 因10 23,j = 6 因 i j,將44與10交換 26 10 j 19 37 30 13 44 i 23 pass 1 設定基準為23 26 10 19 37 30 13 44 23 初值 說 明 快速排序法過程 42 [33] 27 20 18 15 13 11 10 pass 6: 33] [42 27 [20] 18 15 13 11 10 pass 5: 33] [42 27 20] [18 15 13 11 10 pass 4: 20] 42 18 33 [27 15 13 [11] 10 pass 3: 20] 42 18 33 [27 15 11] [
文档评论(0)