Java排序算法之快速排序

快速排序

首先在數組中選擇一個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),而後分別從數組的兩端掃描數組,設兩個指示標誌(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).對於三數取中選擇基準點是最理想的一種。優化