1.基本思想:
選擇一個基準元素,通常選擇第一個元素和最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於登陸基準元素,此時基準元素在其排好序之後的正確位置,然後再用同樣的方法遞歸的排序劃分的兩部分。
2.實例:
3.代碼實現:
package com.sfd.quicksort;
public class QuickSort {
public static void main(String[] args) {
int[] a = {57,68,59,52,72,28,96,33,24,19};
quickSort(a, 0, a.length-1);
for(int i:a){
System.out.println(i);
}
}
/**
* 通過一次掃描將數組分成了兩部分(分區),分別對這兩部分進行partition處理;
* 直到無法在進行分割位置,就是一個分區中只有一個數據即left>=right時
* @param a
* @param left
* @param right
*/
public static void quickSort(int[] a,int left,int right){
int pt;
if(left<right){
pt = patition(a, left, right);
quickSort(a,left, pt);
quickSort(a, pt+1, right);
}
}
/**
* 將數組中left到right中的數進行分區,首先設定一個標準值:pivot
* 再進行雙向掃描:大於基準值的pivot的放在右側,小於pivot的放在右側;
* 最後當left>=right時,停止掃描;
*
* @param a
* @param left
* @param right
* @return
*/
public static int patition(int[] a,int left,int right){
int pivot = a[left];
while(left<right){
while(left<right&&a[right]>pivot){
right--;
}
if(left<right){
a[left++]=a[right];
}
while(left<right&&a[left]<pivot){
left++;
}
if(left<right){
a[right--]=a[left];
}
}
a[left]=pivot;
return left;
}
}