首先在數組中選擇一個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),而後分別從數組的兩端掃描數組,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,若是發現有元素比該基準點的值小,就交換lo和hi位置的值,而後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復循環,直到lo>=hi,而後把基準點的值放到hi這個位置。一次排序就完成了。之後採用遞歸的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該數組就天然有序了。java
排序過程:web
排序算法代碼實現:算法
public class QuickSort {
public static void main(String[] args) {
int[] testArray={18,49,35,9,29,40};
sort(testArray);
for(int i=0;i<testArray.length;i++){
System.out.print(testArray[i]+" ");
}
}
/** * 快速排序 * @param array */
public static void sort(int[] array){
if(array.length>0){
quickSort(array,0,array.length-1);
}
}
/** * 遞歸排序當前數組 * @param array * @param low * @param high */
public static void quickSort(int[] array,int low,int high){
if(low<high){
int middle=getMiddle(array,low,high);//將數組進行一分爲二
quickSort(array,low,middle-1);//對低字段表進行遞歸排序
quickSort(array,middle+1,high);//對高字段表進行遞歸排序
}
}
/** * 查找出中軸(默認是最低位low)的在numbers數組排序後所在位置 * @param array * @param low 開始位置 * @param high 結束位置 * @return 中軸所在位置 */
public static int getMiddle(int[] array,int low,int high){
int temp=array[low];//數組的第一個做爲中軸
while (low<high){
while (low<high&&array[high]>=temp){
high--;
}
array[low]=array[high];//比中軸小的記錄移到低端
while (low<high&&array[low]<=temp){
low++;
}
array[high]=array[low];//比中軸大的記錄移到高端
}
array[low]=temp;//中軸記錄到尾
return low;// 返回中軸的位置
}
}
打印結果:
9 18 29 35 40 49 數組
快速排序的優化svg
對於基準位置的選取通常有三種方法:固定切分,隨機切分和三取樣切分。固定切分的效率並非太好,隨機切分是經常使用的一種切分,效率比較高,最壞狀況下時間複雜度有可能爲O(N2).對於三數取中選擇基準點是最理想的一種。優化