快速排序的思想:數組
先以一個元素做爲標準,找到這個元素的位置,這個位置前的數據都比這個元素小,這個元素後的數據都比這個元素大。dom
下面代碼適用場景,沒有大量重複元素的數據。函數
因爲比較懶,盜個圖吧:性能
初版代碼以下:優化
//快速排序
public void quickSort(Integer[] arr,int n){
//遞歸函數入口
__quickSort(arr,0,n-1);
}
public void __quickSort(Integer[] arr,int l,int r){
//第一次優化,小於15,直接插入排序,省去遞歸過程
if(r-l<=15) {__meargeInsertSort(arr,l,r);return ;}
//找到分區插入的位置,
int p = __quickSortPartition(arr,l,r);
//遞歸快排
__quickSort(arr,l,p-1);
__quickSort(arr,p+1,r);
}
public Integer __quickSortPartition(Integer[] arr,int l,int r){
//找到隨機種子,排除已是順序數組所帶來的性能影響
Random random = new Random();
int seedid = random.nextInt(r-l+1)+l;
int v = arr[l];
arr[l] = arr[seedid];
arr[seedid] = v;
//arr[l+1...j]<v arr[j+1...r]>v
v = arr[l];
int i=l+1,j=l;
for(;i<=r;i++){
if(arr[i]<v) {
int temp = arr[i];
arr[i] = arr[j+1];
arr[j+1]=temp;
j++;
}
}
return j;
}
第二版代碼:
使用場景,有大量重複的數據的時候,沒有重複數據的時候,上述代碼會稍微好一點點,但整體來講,處理速度在一個恆定的範圍內。
//快速排序---去除重複
public void quickSort2(Integer[] arr,int n){
__quickSort2(arr,0,n-1);
}
public void __quickSort2(Integer[] arr,int l,int r){
if(r-l<=15){__meargeInsertSort(arr,l,r); return;}
int p=__quickSortPartition2(arr,l,r);
__quickSort2(arr,l,p-1);
__quickSort2(arr,p+1,r);
}
public int __quickSortPartition2(Integer[] arr,int l,int r){
Random random = new Random();
int selectid = random.nextInt(r-l+1)+l;
int v = arr[selectid];
arr[selectid] = arr[l];
arr[l] = v;
int i=l+1,j=r;
while(true){
while(arr[j]>=v && j>l) j--;
while(arr[i]<=v && i<=r) i++;
if(i>j) break;
int t =arr[j];
arr[j] = arr[i];
arr[i]=t;
j--;
i++;
}
return j;
}
第三版,三路排序,再也不討論。
代碼以下:ui
//快速排序--三路public void quickSort3Ways(Integer[] arr,int n){ __quickSort3Ways(arr,0,n-1);}public void __quickSort3Ways(Integer[] arr,int l,int r){ //優化 if(r-l<=15){__meargeInsertSort(arr,l,r);return;} //隨機種子,偷懶了 int v =arr[l]; //i是進行循環,gt是大於v的數組,lt是小於v的邊界,lt-gt是等於v int i=l+1,gt=r+1,lt=l; for(;i<gt;i++){ if(arr[i]<v) { int t = arr[i]; arr[i] = arr[lt+1]; arr[lt+1]=t; lt++; } else if(arr[i]>v){ int t=arr[i]; arr[i] = arr[gt-1]; arr[gt-1] =t; gt--; } } //交換lt和l的值 int t = arr[lt]; arr[lt] = arr[l]; arr[l] = t; //lt-1,由於lt最後和t進行了互換 __quickSort3Ways(arr,l,lt-1); __quickSort3Ways(arr,gt,r);}