快速排序演算法思想: 快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序 ...
快速排序演算法思想:
快速排序(Quicksort)是對冒泡排序的一種改進。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 用一個演算法排序圖形象表示了快速排序一趟快速排序的演算法是:
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-完成的時候,此時令迴圈結束)最通俗的講法:
取第一個數跟數組中的其他數比較,小的在左邊大的在右邊,就這樣一直遞歸排序
排序的基本過程
以數組{49,38,65,97,76,13,27,49}為例,選擇第一個元素49為基準初始化關鍵字: [49,38,65,97,76,13,27,49]
代碼實現:
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 int a[] = {49, 38, 65, 97, 76, 13, 27, 49};//設置一個數組 4 sort(a,0,a.length-1); //調用快速排序方法 5 System.out.println(Arrays.toString(a)); //將快速排序過的數組輸出 6 } 7 public static void sort(int a[], int left, int right) { 8 int i, j, key; 9 if (left > right) { //這個判斷很重要的,有這個才會在函數遞歸的時候跳出 10 return; 11 } 12 i = left; //左邊第一位開始 13 j = right; //右邊最後一位 14 key = a[i]; //用數組的第一位數做為參考數 15 while (i < j) { // 從數組的兩端交替向中間掃描 16 while (i < j && a[j] >= key){ //從右邊開始掃描 17 j--; 18 } 19 //跳出迴圈說明右邊這個點的數有比參考數小,所以兩個數互換位子,小的到左邊 20 a[i] = a[j]; 21 while (i<j && a[i]< key){ //再從左邊掃描 22 i++; 23 } 24 //跟上面同理,只是相反 25 a[j] = a[i]; 26 } 27 a[i] = key; //這是迴圈到最後的時候 a[j] = a[i];產生重覆,i的位置的數應該是key,所以替換回來 28 sort(a, left, i - 1); // 對小於key一邊的遞歸排序 29 sort(a, i + 1, right); // 對高於key一邊的遞歸排序 30 //直到兩邊排序完畢,在以上中的if判斷中跳出這個方法成功快速排序 31 }