已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過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個元素,n個元素時間複雜度為o(n*k)。
更好的辦法是堆排序,我們維護乙個大小為k的最小堆,先將a[0]~a[k-1]放入堆heap中調整,則heap[0]就是最小值,這個元素就可以被排除出堆,放在a[0]位置。
然後把a[k]加入最小堆,繼續調整,最小值放在a[1],然後排除a[1],再加入a[k+1],重複操作,直到最後乙個元素。
這時,陣列中最後k個元素仍然是沒有排序的,這時對他們使用堆排序即可。不過同樣是用最小堆的排序,注意--k,因為元素在不斷減小。
**如下:
class scalesort
private:
void heap_dispose(vector& a, const int size, int k)
heap[i] = temp; //注意是i
}};
要注意的是,最後是heap[i] = temp,寫成heap[child] = temp就等著排錯吧。
這裡順便提一下std::copy和std::copy_n函式,它們只負責複製,不會申請空間,提防段錯誤:
std::copy:
std::copy(start, end, std::back_inserter(container));
std::copy(start, end, container.begin());
std::copy_n:
outputiterator copy_n (inputiterator first, size n, outputiterator result)
小範圍排序
已知乙個幾乎有序的陣列,幾乎有序是指,如果把陣列排好順序的話,每個元素移動的距離可以不超過k,並且k相對於陣列來說比較小。請選擇乙個合適的排序演算法針對這個資料進行排序。給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。測試樣例 2,1,4,3,6,5,8,7,10,9 10...
小範圍排序
給定乙個int陣列a,同時給定a的大小n和題意中的k,請返回排序後的陣列。時間複雜度 o n 的.桶排序 由於陣列大小和區別無法確定,最好別用 時間複雜度 o nlogn 的 堆排序 已經每個元素最多移動k個距離,那麼最下的那個數移動到陣列第乙個位置距離最多為k,可以建立長度為k的小根堆,並且彈出堆...
小範圍排序(C )
關於演算法與資料結構的相關博文 二叉樹相關練習題 c 經典排序演算法的c 實現 與字串有關的一些典型問題的c 解法 一些可以用動態規劃 dp 演算法解決的問題 c 排列組合相關筆試面試題 c 與概率相關的演算法題c 解法 附證明過程 二分查詢的巧妙運用 c 位運算在演算法題中的使用 c 鍊錶相關練習...