快速排序–學習筆記
快速排序過程:
【示例】:
初始關鍵字 [49 38 65 97 76 13 27 49]
一趟排序之後 [27 38 13] 49 [76 97 65 49]
二趟排序之後 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之後 13 27 38 49 49 [65]76 97
最後的排序結果 13 27 38 49 49 65 76 97
各趟排序之後的狀態
*/
//通俗的說,快速排序是選取一個基準元素R,將待排序的數組中的元素與它比較,大於等於它的元素放在它之後,
//小於等於它的放在它之前,在它的左邊都是小於等於它的元素,右邊都是大於等於它的元素
//繼續在R左,R右兩個待排序的區域進行上述的操作,取一個基準元素S一直操作,直到待排序的區域元素全部拍好序爲止
//算法是:1)設置兩個變量I、J,排序開始的時候:I=0,J=N-1;
//2)以第一個數組元素作爲關鍵數據,賦值給key,即 key=A[0];
//3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與key交換;
//4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與key交換;
//5)重複第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到爲止。
public class demo {
public void sort(Integer[] intgArr, int low, int high) {
quickSort(intgArr,low,high);
}
private int quickSort(Integer[] intgArr, int low, int high) {
int pivot=low;
while (true) {
if (pivot!=high) {
if (intgArr[high].compareTo(intgArr[pivot])<0) {
swap(intgArr, high, pivot);
pivot=high;
}else {
high--;
}
}else {
if (intgArr[low].compareTo(intgArr[pivot])>0) {
swap(intgArr, low, pivot);
pivot=low;
}else {
low++;
}
}
if (low==high) {
break;
}
}
return pivot;
}
public void swap(Integer[] array, int i, int j) {
if (i != j) {//只有不是同一位置時才需交換
Integer tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
/**
* 測試
* @param args
*/
public static void main(String[] args) {
Integer[] intgArr = { 5, 9, 1, 4, 2, 6, 3, 8, 0, 7 };
demo quicksort = new demo();
quicksort.sort(intgArr,0,intgArr.length-1);
for(Integer intObj:intgArr){
System.out.print(intObj + " ");
}
}
}