已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過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 是指利用堆積樹 堆 這種 資料結構所設計的一種 排序演算法,它是選擇排序的一種。可以利用 陣列的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是 完全二叉樹。本次堆排序利用了小根堆堆頂記錄的 關鍵字最小這一特徵,使得在當前無序區中選取最小關鍵字的記錄變得簡單。用小根堆排...