算法2013101701

来源:互联网 发布:易语言cc攻击器源码 编辑:程序博客网 时间:2024/05/16 01:16

题设:长度为N的整型数组X为乱序,记排序后数组为X',对X中的任一元素X[i],其在X'中的位置为j,满足|j - i| <= k < N,求对X进行排序的算法。

解法1. 改进的选择排序法。一般情况下,查找未排序元素中最小者的时间复杂度为O(N),总的时间复杂度是O(N);在本题中,由于元素的初始位置与最终位置之间的距离不大于k,查找过程可以化简为O(k),故总的时间复杂度为O(kN). 由于选择排序的过程中,会发生元素交换,需要证明交换操作不会破坏限制条件|j - i| <= k。

1. 记数组X的最小值为X[p],则必有X'[0] == X[p]且0 <= p <= k

2. 记数组X的首元素为e,则必有e == X[0] == X'[q]且0 <= q <= k

3. 选择排序时,需要交换X[0]与X[p],则元素e的新位置为p

4. 元素e的当前位置p与最终位置q之间的距离,仍然满足关系式|p - q| <= k

5. 经过以上操作,待排序区间从[0, N-1]缩减为[1, N-1],且限制条件仍然保持

# @return the lowest possible original position for pos def getLowFor(N, pos, k):assert pos >= 0 and pos < Nreturn max(0, pos - k)# @return the highest possible original position for pos def getHighFor(N, pos, k):assert pos >= 0 and pos < Nreturn min(N - 1, pos + k)# select sortdef spanSortSelect(X, k):assert k >= 0N = len(X)if N <= 1 or k == 0:# already sorted, do nothingNoneelse:for pos in range(0, N):high = getHighFor(N, pos, k)minLeft = X[pos]index = pos# [pos, high]for i in range(pos, high+1):if X[i] < minLeft:minLeft = X[i]index = iif index != pos:# swap if necessaryX[pos], X[index] = X[index], X[pos]

解法2. 改进的冒泡排序法。总的时间复杂度与解法1同为O(kN),但该算法是稳定的。冒泡排序中,相邻元素之间会发生交换,需要证明交换操作不会破坏限制条件。

1. 设当前冒泡到位置p,记元素a == X[p],则对任意i < p,必有X[i] < a

2. 记a == X'[p'],b == X[p+1] == X'[p''],由于a > b而需要交换,则必有
|p' - p| <= k (1)
|p''-(p+1)| <= k (2)
而且
p'' < p' (3)
由于元素a的最终位置一定不会在p+1之前,故有
p' >= p+1 (4)

3. 交换后,元素a的新位置为p+1,需要证明当前位置与最终位置之间的距离|p' - (p+1)| <= k。由式(4)知p' >= p+1,即p' - (p+1) >= 0;由式(1)知,p' - p <= k,即p' - (p+1) <= k-1。综合得0 <= p' - (p+1) < k,故关系式|p' - (p+1)| <= k满足

4. 交换后,元素b的新位置为p,需要证明当前位置与最终位置之间的距离|p'' - p| <= k。令记Q == p'' - p,由代入(2)式得|Q-1| <= k,即-k+1 <= Q <= k+1;由式(4)知Q == p'' - p < p' - p,由式(1)知,p' - p <= k,故Q < k。综合得-k+1 <= Q < k,故关系式|p'' - p| <= k满足

# buble sortdef spanSortBubble(X, k):assert k >= 0N = len(X)if N <= 1 or k == 0:# already sorted, do nothingNoneelse:pos = N-1while pos > 0:low = getLowFor(N, pos, k)high = getHighFor(N, pos, k)# though i is in [low, high), actually [low, high] is visitedfor i in range(low, high):j = i+1if X[i] > X[j]:# out of order, bubbleX[i], X[j] = X[j], X[i]pos -= 1


原创粉丝点击