排序演算法的應用

2021-07-11 21:03:01 字數 1337 閱讀 7085

假設序列中有n個元素,取其前k個組成乙個最大堆。由於最大堆的堆頂為序列中最大元素,所以組成的最大堆的堆頂是前k個元素中最大的元素。依次用第k+1到第n個元素與堆頂進行比較,如果比堆頂元素大,那麼該元素肯定不會是前k個最小的元素;如果比堆頂小,那麼堆頂的元素肯定不是前k個最小的元素,此時更新堆頂元素,並重新計算使新堆成為最大堆。依次進行,直到第n個元素結束,那麼留在堆內的元素就是前k個最小的元素。

對於求前k個最小的元素,思想與上面差不多。只不過要取前k個元素建成最小堆,剩餘的元素依次與堆頂元素相比,大則更新堆頂,並重新排列堆;小則放棄。直到n個元素比較完成,留在堆中的就是前k個最大元素。

/*

count : 整個陣列的長度

k : 要獲取前k個最小數

*/void heapsort(int a,int count,int k)else

for(;x>=0;x--)

}

前面的判斷是用來尋找最後乙個非葉子節點(如果二叉樹根節點記為編號記為0,那麼編號為k的節點其左右子節點的編號分別為2k+1,2k+2)。並依次調整每乙個非葉子節點的位置。

adjustatpos()如下:

void adjustatpos(int a,int count,int pos){

int index = pos;

while(2*pos+1 < count){

if(a[pos] < a[2*pos+1])

index = 2*pos+1;

if(2*pos + 2while判斷如果成立表明該節點肯定有左節點。

第乙個if判斷如果成立表明當前節點的值小於其左節點的值,用index記錄下該節點的編號。如果不成立,那麼index就是pos。這個判斷執行完畢之後,index儲存的就是根節點和左節點中值比較大的節點的編號。

第二次if判斷成立的話,表明其有右節點。內層的判斷邏輯與上面一樣。

上述**執行完畢後,index指的就是根節點,左、右節點中值比較大的節點的編號(下標)。因此,如果index == pos成立,那麼意味著根節點是最大的,不需要進行調整。如果不成立,並假設index記錄的是左節點的下標,那麼就需要交換左節點與根節點的值(swap()方法的作用),交換完畢之後左子樹就不一定是最大堆了,又需要重新呼叫左子樹,這就是pos = index的作用。

在上面的求前k個最小數時,建立的是最大堆,直到序列的最後乙個元素遍歷結束後,堆頂仍舊是堆中最大的元素。因此堆頂是第k個最小的元素。

利用這,就可以求出第k大或第k小的元素。

求前k個最小元素或者第k小的元素,使用最大堆,堆的節點個數為k,堆頂的元素就是第k個最小的元素。求前k個最大元素或第k個最大元素,利用最小堆,堆的節點個數為k,堆頂的元素就是第k個最大的元素。

經典排序演算法的應用

問題 給定陣列arr,元素個數為n,將其排序後元素移動的順序不超過k,其中k 分析 1.氣泡排序,選擇排序,快速排序,歸併排序等排序時間複雜度與陣列狀態無關。2.插入排序複雜度為o n k 3.改進後的堆排序可以做到o n logk 改進後的堆排序 1.考慮到每次移動不超過k,則最小的元素在0.k中...

7 6 2 內部排序演算法的應用

1 選取排序方法需要考慮的因素 1 待排序的元素數目n。2 元素本身資訊量的大小。3 關鍵字的結構及其分布情況。4 穩定性的要求。5 語言工具的條件,儲存結構及輔助空間的大小等。2 排序演算法小結 1 若n較小 n 50 則可以採用直接插入排序或簡單選擇排序。由於直接插入排序所需的記錄移動操作較簡單...

堆排序演算法及其應用

堆積排序是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法,可以利用陣列的特點快速定位指定索引的元素。堆可以被看成是一棵樹,結點在堆中的高度可以被定義為從本結點到葉子結點的最長簡單下降路徑上邊的數目 定義堆的高度為樹根的高度。我們將看到,堆結構上的一些基本操作的執行時間至多是與樹的高度成正比,為...