快速排序:
以數組中最後一個數爲基準值,然後從數組的兩頭(即 數組下標爲0,和下標爲arrray.length-1處)分別開始遍歷數組,將小於基準值的數放在數組的左邊,將大於基準值的數放在數組的右邊,最後將基準值放在這兩部分中間,最後導致,基準值左邊的數都比基準值小,基準值右邊的數都比基準值大;然後從基準值處分爲左右兩部分,對左邊的那一部分數再進行快速排序,對右邊的那一部分數也再進行快速排序;遞歸循環。
比如:數組{1,3,8,2,0,11,6,7,21,9}, 以最右邊的數9爲基準值,經過一次快速排序,變爲:1,3,8,2,0,6,7,9,11,21;則基準值所在的下標變爲7,分爲兩部分,然後將{1,3,8,2,0,6,7}和{11,21}分別再進行快速排序,{1,3,8,2,0,6,7}以7爲基準值,{11,21}以21爲1基準值,分別進行快速排序;以此類推循環。
private static void quickSort(int[] array){
quickSortInner(array,0,array.length-1);
}
private static void quickSortInner(int[] array,int left,int right){
//當[left,right]之間只剩一個數或沒有數存在時,就結束了
if(left==right){
return;
}
if(left>right){
return;
}
//先找出來基準值最終所在的位置
//int splitVaule=partion1(array,left,right);
//int splitVaule=partion2(array,left,right);
int splitVaule=partion3(array,left,right);
quickSortInner(array,left,splitVaule-1);
quickSortInner(array,splitVaule+1,right);
}
//獲取基準值下標的方法 hover法
private static int partion1(int[] array, int left, int right) {
//以最右邊的數爲標準,將其它數與其相比較
int vaule=array[right];
int begin=left;
int end=right;
while(begin<end){
while(begin<end&&array[begin]<=vaule){
begin++;
}
while(begin<end&&array[end]>=vaule){
end--;
}
//當begin和end停止繼續時,說明不滿足左邊的比基準值小,右邊的比基準值大了
//則將這兩個位置的數互換
int t=array[begin];
array[begin]=array[end];
array[end]=t;
}
//將基準值換到begin這個位置
int temp=array[begin];
array[begin]=vaule;
array[right]=temp;
//返回基準值所在的下標
return begin;
}
找出基準值所在的位置的方法還有:挖坑法、前後下邊法
挖坑法:
挖坑法與上面的hover法的不同之處就在於:將基準值保存下來,此處就相當於有一個坑,在進行遍歷時,每有不滿足條件的,就用那個不滿足條件的數來填坑,然後不滿足條件的數的位置處就變成了一個坑,等待另外一個不滿足條件的數來填坑,到最後循環結束時,就用基準值來填剩下的那個坑。
//獲取基準值下標的方法 挖坑法
private static int partion2(int[] array, int left, int right) {
//以最右邊的數爲標準,將其它數與其相比較
int vaule=array[right];
int begin=left;
int end=right;
while(begin<end){
while(begin<end&&array[begin]<=vaule){
begin++;
}
array[end]=array[begin];
while(begin<end&&array[end]>=vaule){
end--;
}
array[begin]=array[end];
}
//將基準值換到begin這個位置
array[begin]=vaule;
//返回基準值所在的下標
return begin;
}
前後下標法:
//獲取基準值下標的方法 前後下標法
//0~d之間是小於基準值的,d~i之間是大於基準值的
//將最右邊的數作爲基準值
private static int partion3(int[] array, int left, int right) {
int d=left;
for(int i=left;i<right;i++){
if(array[i]<array[right]){
//就將這個數移到array[d]的前面,就保證了下標d前面的數都是小於array[right]的
//即 將array[i]與array[d]互換位置
int t=array[d];
array[d]=array[i];
array[i]=t;
//array[d]的位置也後移一位
d++;
}
}
//最後將array[right]與array[d]換一下位置
int temp=array[d];
array[d]=array[right];
array[right]=temp;
return d;
}