用堆排序實現大致已經排好序的序列

2021-07-26 20:51:32 字數 615 閱讀 5253

已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過k,並且k相對於陣列來說比較小。請選擇乙個合適的排序演算法針對這個資料進行排序。

給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。

測試樣例:

[2,1,4,3,6,5,8,7,10,9],10,2

返回:[1,2,3,4,5,6,7,8,9,10]

可以利用堆排序,不超過k,每組選擇k+1個數,從0開始,每組內進行建堆,建完最小堆之後最前面的元素就是最小值。之後下標加1,繼續進行堆排序,時間複雜度可以達到(log(n+k))空間複雜度為o(1)因為使用迴圈實現最小堆,沒用呼叫棧。不穩定排序。

**如下:

class scalesort 

while(n-i>1)

return a;

// write code here

}void buildheap(vector

&a,int begin,int k)

for(int i=(k-4)/2;i>=0;--i)

}void swapnum(int &a,int &b)

};

排序 四 歸併排序(合併兩個已經排好序的陣列)

是建立在歸併操作上的一種有效的排序演算法。平均 最好和最壞時間複雜度都為o nlog2n 線性對數。是穩定的。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,且各層分治遞迴可以同時進行。也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併排序演算法依...

用C 實現堆排序

極大堆 排序後從小到大 是具有以下性質的完全二叉樹,每個結點的值都大於等於左右結點的值 下面是使用極大堆的方式進行排序,使用極小堆的排序原理差不多。include using namespace std void heapadjust int a,int s,int n void heapsort ...

用C實現堆排序

堆排序 heapsort 是指利用堆積樹 堆 這種 資料結構所設計的一種 排序演算法,它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是 完全二叉樹。本次堆排序利用了小根堆堆頂記錄的 關鍵字最小這一特徵,使得在當前無序區中選取最小關鍵字的記錄變得簡單。用小根堆排...