標籤:
快速排序(Quicksort)是對冒泡排序的一種改進。它是先在數組中找到一個關鍵數,第一趟排序將比關鍵數小的放在它的左邊,比關鍵數大的放在它的右邊。當第一趟排序結束後,再依次遞迴將左邊和右邊的進行排序,直到最後整個數組都有序為止。
一趟快速排序的演算法是:
1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1;2)以第一個數組元素作為關鍵資料,賦值給
key,即
key=A[0];3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於
key的值A[j],將A[j]和A[i]互換;4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於
key的A[i],將A[i]和A[j]互換;5)重複第3、4步,直到i=j; (3,4步中,沒找到合格值,即3中A[j]不小於
key,4中A[i]不大於
key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到合格值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。 圖解: 下面是代碼的實現 快速排序類:
package com.dxx.order;public class QuicSort { public int[] sortArrs(int []arrs,int low,int high){ int l = low; int h = high; int povit = arrs[low]; //當l<h時,繼續遞迴排序,當l=h時,說明已經一趟排序成功,退出 while(l<h){ //關鍵點和右邊的h位元比較,如果小於右邊h位的數,則h-1,即右邊的標誌左移一位 while(l<h && arrs[h]>povit) h--; if(l<h){ //當關鍵點大於h標誌位的數時,交換兩數的位置,l++,將關鍵點和左邊l標誌位的數比較 int temp = arrs[l]; arrs[l] = arrs[h]; arrs[h] = temp; l++; } //反過來,將關鍵數與左邊的數進行比較 while(l<h && arrs[l]<povit) l++; if(l<h){ //當關鍵點小於l標誌位的數時,交換兩數的位置,h--,當l=h時一趟排序結束 int temp = arrs[l]; arrs[l] = arrs[h]; arrs[h] = temp; h--; } } if(l>low)sortArrs(arrs, low, l-1); if(h<high)sortArrs(arrs, h+1, high); return arrs; } public void printArrs(int []arrs){ for(int i :arrs){ System.out.print(i + " "); } System.out.println(); } }
主程式運行類:
package com.dxx.order;public class MainTest { public static void main(String[] args) { int arrs[] = {14,3,2,5,12,8,6,7,10,11,1,9,13}; QuicSort quicSort = new QuicSort(); quicSort.printArrs(arrs); arrs = quicSort.sortArrs(arrs,0,arrs.length-1); quicSort.printArrs(arrs); }}
快速排序java