题目:给定一个无序数组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).
分析至此,代码的实现则不难了。