通過一趟排序將待排記錄使用分治演算法把乙個串(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 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...
排序演算法之快速排序
快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...