排序演算法之快速排序

2021-10-09 06:55:09 字數 1470 閱讀 6388

通過一趟排序將待排記錄使用分治演算法把乙個串(list)分為兩個子串(sub-lists),其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊,在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作;遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。簡要步驟如下

1) 每次排序的時候從數列中挑出乙個元素設定乙個基準點(比如我們把左邊第一位當做基準點或者隨機找一位當成基準點)

2)搞2個座標,分別從左邊(假如是i)和右邊(假如是j)開始和基準值對比,

3)基準值比左邊的值大,i左邊向右移動(前置條件是i,在對比過程中基準值比左邊值小的話i跳出迴圈,記錄i的座標

4)基準值比右邊值小,j左邊向左移動(前置條件是i,在對比過程中基準值比左邊值小的話i跳出迴圈,記錄j的座標

5)把座標i的值和座標j的值互換(這裡說明i的座標的值比較大,而j座標的值比較小,需要互換)

6) 當i和j走到座標位置相同時,和基準位置進行資料互換(既和座標第一位互換)

7) 經過上面6步,就已經把乙個串分成2個子串了,切左邊的值都比右邊的小,遞迴呼叫2個子串就行了

最佳情況:t(n) = o(nlogn)   最差情況:t(n) = o(n2)   平均情況:t(n) = o(nlogn)

public class quicksort 

int i=begin;

int j=end;

/*** 把左邊第乙個當成基準物件,我們這是3

*/int benchmarkvalue = array[begin];

while (i=array[i]&&i/**

* 當i*/

if (i}

/*** 基準為與i和j相等時,則講該下標的值和基準物件互換

*/array[begin] = array[i];

array[i] = benchmarkvalue;

//遞迴排序左邊的陣列

quicksort(array, begin, j-1);

//遞迴排序右邊的陣列

quicksort(array, j+1, end);

}/**

* 大致意思把第乙個數當成對比引數,就是用從前往後挨個和最後乙個對比,如果比參照數大,那個數就和後前面的位置置換下,最後把末尾的引數數和剛才比較大的哪個數替換

* 然後在遞迴對比剛才哪個引數的座標,前後進行對比

* @param args

*/public static void main(string args) ;

quicksort(array,0,array.length-1);

system.out.println(arrays.tostring(array));

}}

排序演算法之快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...

排序演算法之快速排序

快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...

排序演算法之快速排序

快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...