设为首页 收藏本站
查看: 456|回复: 0

[经验分享] Python折半插入排序

[复制链接]

尚未签到

发表于 2017-5-1 09:32:10 | 显示全部楼层 |阅读模式
折半插入排序是插入排序的一种,这是直接插入排序的改进,当将要为i元素排序时,[0,i-1]位置的元素已有序,用折半查找法比顺序查找一般要快些.
  实现思路:
  i属于[1,n], 
  在[0,i-1]中取得中间位置k=(min+max)/2,这个区间已排好序,递归比较中间值, 直到 |min-max| <=1为止,将i元素插入到k附近.


#折半排序类
class HalfInsertSort:  
#开始排序
#arrData:要排序的数组
def sort(self, arrData):  
for i in range(1,len(arrData)):
self.halfSort(arrData,i,0,i-1);
print(arrData);
return;  
#折半排序
#target:要排序的目标的索引值
#mi:已排序的最小索引
#ma:已排序的最大索引
#target要在[mi,ma]中查找合适的位置
def halfSort(self,arrData,target,mi,ma):  
i=(mi+ma)//2;#中间索引
c=arrData[target]-arrData;
if mi==ma or i==ma or i==mi:
d=arrData[target]-arrData[ma];
if c>=0 and d<0:
self.insert(arrData,target,i + 1);
elif c<0:
self.insert(arrData,target,i);
elif d>=0:
self.insert(arrData,target,ma + 1);
return;
if c>0:
self.halfSort(arrData,target,i+1,ma);
elif c==0:
self.insert(arrData,target,i+1);
return;  
else:
self.halfSort(arrData,target,mi,i-1);      
return;
#将目录插入到dest位置
def insert(self,arrData,target,dest):  
tmp=arrData[target];
i = target - 1;
#将dest身后的已排序的元素向后移动一位
while i>=dest:
arrData[i+1]=arrData;
i = i -1;
arrData[dest]=tmp;  
return;  
sortVal=HalfInsertSort();  
sortVal.sort([7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58]);  


[2, 7, 5, 3, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[2, 5, 7, 3, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[2, 3, 5, 7, 1, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 7, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 7, 8, 6, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 100, 48, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 48, 100, 38, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 38, 48, 100, 45, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 38, 45, 48, 100, 20, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 38, 45, 48, 100, 34, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 34, 38, 45, 48, 100, 67, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 20, 34, 38, 45, 48, 67, 100, 12, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 34, 38, 45, 48, 67, 100, 23, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 67, 100, 90, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 67, 90, 100, 58]
[1, 2, 3, 5, 6, 7, 8, 12, 20, 23, 34, 38, 45, 48, 58, 67, 90, 100]

  自己实现的排序算法还是和书上的不一样,不用递归更简单些

#折半排序类
class HalfInsertSort:  
#开始排序
#arrData:要排序的数组
def sort(self, arrData):  
for i in range(1,len(arrData)):
self.halfSort(arrData,i,0,i-1);
print(arrData);
return;  
#折半排序
#target:要排序的目标的索引值
#mi:已排序的最小索引
#ma:已排序的最大索引
#target要在[mi,ma]中查找合适的位置
def halfSort(self,arrData,target,mi,ma):  
i=(mi+ma)//2;#中间索引
c=arrData[target]-arrData;
if mi==ma or i==ma or i==mi:
d=arrData[target]-arrData[ma];
if c>=0 and d<0:
self.insert(arrData,target,i + 1);
elif c<0:
self.insert(arrData,target,i);
elif d>=0:
self.insert(arrData,target,ma + 1);
return;
if c>0:
self.halfSort(arrData,target,i+1,ma);
elif c==0:
self.insert(arrData,target,i+1);
return;  
else:
self.halfSort(arrData,target,mi,i-1);      
return;
#将目录插入到dest位置
def insert(self,arrData,target,dest):  
tmp=arrData[target];
i = target - 1;
#将dest身后的已排序的元素向后移动一位
while i>=dest:
arrData[i+1]=arrData;
i = i -1;
arrData[dest]=tmp;  
return;
#非递归插入排序
def halfSort_(self,arrData,target,mi,ma):
low = mi;
high = ma;
k = 0;
while low <= high:
k = (low + high) // 2;
if arrData[target] > arrData[k]:
low = k+1;
else:
high = k - 1;
if arrData[target] >= arrData[k]:
self.insert(arrData,target,k+1);
else:
self.insert(arrData,target,k);
return;
def sort_(self, arrData):  
for i in range(1,len(arrData)):
self.halfSort_(arrData,i,0,i-1);
print(arrData);
return;  
sortVal=HalfInsertSort();  
sortVal.sort_([7,2,5,3,1,8,6,100,48,38,45,20,34,67,12,23,90,58]);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-371495-1-1.html 上篇帖子: python web.py研究2 下篇帖子: Python实现的堆排序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表