基本排序演算法 快速排序演算法及其優化

2021-09-10 14:04:21 字數 1887 閱讀 9521

快速排序:就是在乙個陣列中先選取乙個參考值v(基準),並將陣列分為小於基準和不小於基準的兩部分(快速排序的基本版),並遞迴將左右部分兩部分繼續分別快速排序,用到了分治的演算法思想,將乙個大問題分解成一系列有相同特點或性質的子問題,當子問題仍無法解決時繼續遞迴劃分,直到子問題可以被解決為止,這樣只要將子問題一一解決,總的問題也就被解決了。

// 對arr[l...r]部分進行partition操作

// 返回p,使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]

template int __partition(t arr, int l, int r)

swap( arr[l] , arr[j]);

return j;

}// 對arr[l...r]部分進行快速排序

template void __quicksort(t arr, int l, int r)

template void quicksort(t arr, int n)

基本的快速排序存在的問題是:當陣列中有大量重複元素的時候,快排的效率較低,因為這個時候左右部分很不平衡。

template int _partition2(t arr, int l, int r)

swap( arr[l] , arr[j]); //交換arr[l]和arr[j]使arr[l]左邊部分元素都小於基準值。

return j; //i停在第乙個不小於基準值v的元素的位置上,而j停在最後乙個小於基準值v的元素的位置上。

}template void _quicksort(t arr, int l, int r)

int p = _partition2(arr, l, r);

_quicksort(arr, l, p-1 );

_quicksort(arr, p+1, r);

}template void quicksort(t arr, int n)

二路快速排序將相同值的元素盡量平分給了左右部分,使得對有大量重複元素的陣列的排序效率有了較大的提高。

基準v小於v等於ve未遍歷到大於v

void __quicksort3ways(t arr, int l, int r)

swap( arr[l], arr[rand()%(r-l+1)+l ] ); //選取基準的時候隨機選取。

t v = arr[l];

int lt = l; // arr[l+1...lt] < v ,lt的大小為最後乙個小於基準值的元素下標值

int gt = r + 1; // arr[gt...r] > v ,gt的大小為第乙個大於基準值的元素的下標值

int i = l+1; // arr[lt+1...i) == v ,i的大小始終為當前待判斷的元素的下標值

//在設定lt,gt,i的初始值的時候要先保證這時候v三個區間內不存在元素,因為這時候還沒開始分出來,下面的while()迴圈才是選出元素的。

while( i < gt )

else if( arr[i] > v )

else

}swap( arr[l] , arr[lt] );

__quicksort3ways(arr, l, lt-1);

__quicksort3ways(arr, gt, r);

}template void quicksort3ways(t arr, int n)

基本排序演算法之快速排序

快速排序演算法是一種劃分交換的方法,它採用分治法進行排序。其基本思想是 設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的 排序...

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...