算法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
- 算法2013101701
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- 算法
- HTML基础入门(一)
- 折腾的人生......
- CSS margin + spadding 、HTML table cellpadding + cellspacing、QFrame模型 QGridLayout margin +spacing
- 函数指针
- HTML必知
- 算法2013101701
- android 单元测试
- C# Hadoop学习笔记(三)—集群部署结构
- Win7删除无线网络连接2的方法
- 软件测试基础知识总结
- VC++程序常见错误 提示(4)---gyy整理
- moonseo怎么样?--致我逝去的3年seo青春!
- EasyUi_学习之路_02
- 三维空间异面直线的距离及最近点