踏踏實實學演算法,從今天開始,從現在開始。
快速排序的思想:每次遞迴選擇乙個樁,取其值(int pivot = array[pivotindex]),從陣列末尾向前尋找第乙個小於該值pivot的元素將其放到樁處(記錄該位置為high),從陣列開始向後尋找第乙個大於該值pivot的元素將其放到high處,再反覆從後面往前尋找小於pivot的元素和從前往後尋找大於pivot的元素,直到兩者相遇位置(low >= high 則本次劃分迴圈結束),最後講pivot放到low處(做人要低調!實際放到high處也行!哈哈哈)。每次遞迴結束,pivot左邊的元素均小於pivot,pivot右邊的元素均大於pivot。總的遞迴結束後,陣列實現排序。樁值選擇:選擇每次遞迴陣列的第乙個元素(簡單版本採取該方式,適合陣列元素隨機)。但不建議使用使用該方式,如果陣列元素已經有序或逆序,使用本方式將會十分浪費時間。
樁值選擇優化:
1. 一種安全的選擇:選擇陣列中間元素(實現也很簡單,講中間元素與第乙個元素交換,再選擇第乙個元素作為樁值),安全合理但卻有些消極。
2. 最好的選擇是選擇陣列的中值,能夠很好地均分陣列。但計算中值會降低演算法效率,所以選擇乙個估計值:選擇array[start], array[mid]和array[end]的中值作為樁值。
其他優化:陣列長度小於10(根據不用情況來估計乙個數值)時採用插入排序,效果會比較好。
public
class quicksort else
if (array[end] < array[start])
if (array[end] < array[mid])
// 將樁值與array[end-1]交換,因為array[end]>array[mid],減少一次比較(不交換也可以正確執行)
swaptwoele(array, mid, end-1);
int pivot = array[end-1];
int low,high;
for (low = start, high = end-1; ; )
swaptwoele(array, low, high);
}swaptwoele(array, low, end-1);
quicksort(array, start, low-1);
quicksort(array, low+1, end);}}
private
static
void swaptwoele(int array, int index1, int index2)
// 簡單版本
public
static
void sort(int array, int start, int end)
array[low] = pivot;
sort(array, start, low-1);
sort(array, low+1, end);}}
public
static
void main(string args) ;
// quicksort.quicksort(array, 0, array.length-1);
quicksort.sort(array, 0, array.length-1);
for (int i = 0; i < array.length; i++)
system.out.print(array[i] + " ");
}}
如果本部落格對你有一定幫助,客官請留下你的腳步吧…
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...