一道關於排序的演算法題

2021-06-18 18:01:09 字數 627 閱讀 4407

題目:給定乙個無序陣列a,一直這個陣列a中的任意乙個元素所在的位置離其最終排序後的位置相差的距離不會超過k。即排序前a[i]在位置i,那麼在排序後該元素的位置會在[i-k,i+k]這個範圍內。現在要求給出乙個演算法使得演算法盡量高校。

解析:

這裡就不多說了,直接給自己的解法吧。利用乙個大小為k+1的最小堆作為輔助。按照如下步驟即可完成對陣列的排序:

1.初始時用a的前k+1個元素建立最小堆,設定兩個標誌位p和q,初始時p指向陣列的第乙個位置,q指向第k+1個位置;

2.取當前堆的最小元素,放在p所指的位置,並且p++,使得p指向下乙個位置;

3.若此時q不是陣列的最後乙個位置,則將q+1位置上的元素插入堆之中,並且q++,然後返回第2步;否則進入第4步;

4.此時是對陣列的最大k+1個元素進行排序了,只需要依次在堆中取最小元素,並放入p所指的位置,並且p++,直到堆為空即可。

下面來看下這個演算法的時間複雜度如何:

初始建堆的時間為o(klogk),之後陣列a的每乙個位置的正確元素的確定都需要一次取堆最小的元素以及乙個插入堆的過程,這兩個過程的時間均為o(logk),因此排序的複雜度為o(nlogk).

分析至此,**的實現則不難了。

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...

一道演算法題

1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...

一道演算法題

include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...