1. 程式人生 > >快速排序再理解(java實現)

快速排序再理解(java實現)

快速排序由於排序效率在同為O(N*logN)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序思想—-分治法也確實實用,因此很多軟體公司的筆試面試,包括像騰訊,微軟等知名IT公司都喜歡考這個,還有大大小的程式方面的考試如軟考,考研中也常常出現快速排序的身影。

該排序方法的基本思想:
(1)先從數列中取一個元素作為基準點
(2)分割槽,將所有比基準點值大的元素放在基準點右邊,將所有比基準點值小的元素放在基準點的左邊
(3)分別對左右兩部分重複步驟2,直到所有的分割槽只有一個元素

具體的實現步驟如下:
(1)首先在陣列中選一個元素作為基準點(一般選第一個元素)。
(2)從陣列的兩端開始掃描陣列,設定兩個指標標示lo和hi(lo指向起始位置,hi指向末尾位置)。
(3)首先從後半部分開始掃描,發現比該基準點值小的元素,交換lo和hi位置的值。
(4)然後從前半部分開始掃描,發現比該基準點值大的元素,交換lo和hi位置的值。
(5)直到lo大於等於hi的時候,然後把基準點的值放在hi的位置,一次排序完成。(這樣後基準點前半部分都比基準點的值小,後半部分都比基準點的值大)
(6)採用遞迴的方式分別對基準點前後兩部分的陣列進行排序。

程式碼實現如下:

public void quickSort(int[] a,int lo,int hi){
    if(lo >= hi) return;
    int i=lo;
    int j=hi;
    int base=a[i];

    while(i < j){//這裡是一次排序的過程
        while(i < j && a[j]>=base){
            j--;//尋找比base大的值
        }
        a[i]=a[j];//找到後交換
        while(i < j && a[i]<base
){ i++;//尋找比base小的值 } a[j]=a[i];//找到後交換 } a[i]=base; //分別對base基準點的前後半部分排序 quickSort(a,lo,i-1); quickSort(a,i+1,hi); }

配合圖講解第一次排序:
這裡寫圖片描述
以數列:4 1 8 3 2 6 7
首先選第一個元素為base基準點也就是base=4 (a[i]);
j從最後一個元素尋找,檔j=4找到2比基準點小,將a[4] (a[i]=a[j])賦值給a[i]如圖第一個方框。
然後i從開始元素尋找,當i=2找到8比基準點大,將a[2] (a[j]=a[i]賦值給a[j]如圖第二個方框)。
然後接著j從j=4開始尋找,j=3找到3比基準點小,將a[3]賦值給a[i],如圖第三個。
接著i從i=2開始尋找,i=3找到3此時i=j,將base賦值給i。
一次排序完成,形成
2 1 3 |4| 8 6 7
然後遞迴呼叫方法接著排序2 1 3和8 6 7
直到完成。