public static void main(String[] args) {
int arr[] = {60,30,70,90,50,10,40,80};
System.out.println("排序前:"+ Arrays.toString(arr));
quickSort(arr,0,arr.length-1);
}
/*
* 左標記的作用是找到一個比基準值pivot大的數字
* 右標記的作用是找到一個比基準值pivot小的數字
*
* */
public static void quickSort(int[] arr,int left,int right){
//進行判斷,left不能比right大
if(left > right){
return;
}
//定義變量保存基準數
int base = arr[left];
//定義變量i,指向最左邊
int i = left;
//定義變量j,指向最右邊
int j = right;
//當i和j不相遇時,在循環中進行檢索
while(i != j){
//先由j從右往左檢索比基準數小的,如果檢索到比基準數小的就停下
//也就是說如果檢索到比基準數大的或者相等的,就繼續檢索
while(arr[j] >= base && i<j){
j--; //j從右往左移動
}
//i從左往右檢索比基準數大的
while (arr[i] <= base && i<j){
i++; //i從左往右移動
}
//代碼走到這裏,說明i和j都停下了,然後交換i和j位置的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//代碼走到這裏 說明 i=j
// i和j相遇了,交換基準數和相遇位置的元素
arr[left] = arr[i];
arr[i] = base;
//基準數在這裏歸位了,左邊的數字都比他小,右邊的數字都比他大
//基準數歸位後,排基準數的左邊。
quickSort(arr,left,i-1);
//排基準數的右邊
quickSort(arr,i+1,right);
System.out.println(Arrays.toString(arr));
}
運行結果:
排序前:[60, 30, 70, 90, 50, 10, 40, 80]
[10, 30, 40, 50, 60, 90, 70, 80]
[10, 30, 40, 50, 60, 90, 70, 80]
[10, 30, 40, 50, 60, 90, 70, 80]
[10, 30, 40, 50, 60, 90, 70, 80]
[10, 30, 40, 50, 60, 70, 80, 90]
[10, 30, 40, 50, 60, 70, 80, 90]
[10, 30, 40, 50, 60, 70, 80, 90]
[10, 30, 40, 50, 60, 70, 80, 90]