快速排序
快速排序是對冒泡排序的一種改進,基本思想是:通過一趟排序將要排序的數據分割成獨立的兩個部分,其中一部分的所有數據都比另一部分的所有數據都小,從而按照此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行
快排示意圖
快排代碼實現
public static void quickSort(int [] arr,int left,int right){
int l = left;//左下標
int r = right;//右下標
int pivot = arr[(left + right) / 2];//中軸值
int temp = 0;//臨時變量
//while循環目的是讓比中軸值小的放左面,大的放右面
while(l < r){
//從左面循環直到找到比中軸值大的元素
while(arr[l] < pivot){
l += 1;
}
//從右面循環直到找到比中軸值小的元素
while(arr[r] > pivot){
r -= 1;
}
if(l >= r){//如果左右座標越界了就退出循環
break;
}
//交換數值
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
//如果交換完成後發現值相等,則r--操作,前移:因爲左側的值是右側交換過來的
if(arr[l] == pivot){
r -= 1;
}
//如果交換完成後發現值相等,則l++操作,後移:因爲右側的值是左側交換過來的
if(arr[r] == pivot){
l += 1;
}
//上面的操也可寫在最開始的循環判斷上加上=
}
if(l == r){//用於當作下面遞歸的左右指針條件,不執行自增或自減,會棧溢出
l += 1;
r -= 1;
}
if(left < r){//看指針是否在左面
quickSort(arr,left,r);
}
if(right > l){//看執政是否在右面
quickSort(arr,l,right);
}
}
下面是對遞歸中的判斷條件的圖解分析