所謂快速排序:基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點並把基準點放於序列的開頭(該基準點的選取可能影響快速排序的效率,關於基準點的選擇方法後面再講解),然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換lo和hi位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復迴圈,直到lo>=hi,然後把基準點的值放到hi這個位置,一次排序就完成了。之後再採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列自然也就有序了。在網上找的關於一次快速排序的示意圖如下圖:
演算法的實現:
1) 首先是進行一輪快速排序的函式:
/**
* 一次快速排序
*@param array 陣列
*@param lo 陣列的前下標
*@param hi 陣列的後下標
*@return key的下標index,也就是分片的間隔點
*/public
static
intpartition(int array,int lo,int hi)
array[lo]=array[hi];
//從前半部分向後掃瞄
while(array[lo]<=key&&hi>lo)
array[hi]=array[lo];
}array[hi]=key;//最後把基準存入
return hi;
}
2) 快速排序的函式如下:
/**
* 快速排序
*@param array
*@param lo
*@param hi
*/public
static
void
quicksort(int array,int lo ,int hi)
//進行第一輪排序獲取分割點
int index=partition(array,lo,hi);
//排序前半部分
quicksort(array, lo, index - 1);
//排序後半部分
quicksort(array,index+1,hi);
}
3) 測試函式:
public
static
void
main(string args) ;
quicksort(arr, 0, arr.length-1);
for(int i:arr)
}
輸出是:
1,3,3,4,7,8,9,12,22,65,
對於基準點的優化一般有三種:固定切分,隨機切分和三數取樣切分。固定切分的效率並不是太好,隨機切分是常用的一種切分,效率比較高,最壞情況下時間複雜度有可能為o(n^2)。對於三數取中選擇基準點是最理想的一種。
下面給出三個數取中間數的演算法實現:
//三數取中
//下面的兩步保證了array[hi]是最大的;
int mid=lo+(hi-lo)/2;
if(array[mid]>array[hi])
if(array[lo]>array[hi])
//接下來只用比較array[lo]和array[mid],讓較小的在array[lo]位置就ok。
if(array[mid]>array[lo])
int key=array[lo];
上面的swap(a, b); 函式的含義就是交換a和b的值。 排序演算法 快速排序 java實現
它採用了一種分治的策略,通常稱為分治法。分治法思想 將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。對於陣列a,隨機選擇乙個元素作為基準數pos,一般為第乙個元素或最後乙個元素。將該陣列分為兩堆a 0,pos index 1 和 a ...
Java實現快速排序演算法
一 演算法描述 快速排序是對氣泡排序的一種改進。在氣泡排序中,記錄每次都是與相鄰位置上的資料作比較,因此每次只能移動乙個位置。而在快速排序中,記錄的比較和移動都是從兩端向中間進行的。其主要思想 首先在待排序陣列中選取乙個基準值 作為比較物件 然後利用基準值將待排陣列分成2個部分。基準值左邊的陣列的資...
java實現快速排序演算法
快速排序是應用很廣泛的排序演算法。主要原因是它實現簡單 適用於各種不同的輸入資料且在一般應用中比其他排序演算法都要快得多。快速排序主要思想就是當兩個子陣列都有序時整個陣列也就自然有序了。而這個過程就是先選出乙個基準數,一般都選第乙個,然後基準數的左邊都是小於基準數的,基準數的右邊都是大於基準數的。然...