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

[经验分享] Python笔记——排序算法的实现

[复制链接]

尚未签到

发表于 2017-5-4 11:57:22 | 显示全部楼层 |阅读模式
  排序算法,目前只实现了七种,后续慢慢会补上~~各位多指教
  分别为:
1. 选择排序
2. 插入排序
3. 冒泡排序
4. 归并排序
5. 快速排序
6. 基数排序
7.计数排序

另外还有希尔,堆,桶排序,以及各种算法的改进版本,需要去处理下

直接贴代码
# file :sort.pyimport mathclass sort:def selectSort(self,L):size = len(L)for i in range(0,size):max=Lindex = ifor j in range(i,size):if L[j] > max:max=L[j]index=jtemp = LL=maxL[index]=tempprint(L)def insertSort(self,L):size = len(L)for i in range(1,size):fv = Lj = iwhile(j>=1):if fv < L[j-1]:L[j] = L[j-1]else:breakj=j-1L[j] = fvprint(L)def bubbleSort(self,L):size = len(L)for i in range(size-1,-1,-1):for j in range(0,i-1):#这里需要注意下,重新看下是否符合,感觉怪怪的if L[j]>L[j+1]:temp = L[j]L[j]=L[j+1]L[j+1] = tempprint(L)def merge(self,L1,L2):L=[]index1 = 0index2 = 0size1 = len(L1)size2 = len(L2)top = min(size1,size2)while(index1!=size1 and index2!=size2 ):if L1[index1] > L2[index2]:L.append(L2[index2])index2 = index2 + 1else:L.append(L1[index1])index1 = index1 + 1if index1 < size1:for i in range(index1,size1):L.append(L1)if index2 < size2:for i in range(index2,size2):L.append(L2)return Ldef mergeInL(self,L,first,mid,last):tempa = []tempb = []for i in range(first,mid+1):tempa.append(L)for i in range(mid+1,last+1):tempb.append(L)tempc = self.merge(tempa,tempb)index = 0for i in range(first,last+1):L = tempc[index]index += 1#我错了。。。本来两个方法,写着写着变三个方法,改天再改def mergeSort(self,L,first,last):#print("1first = %d  last = %d" %(first,last))if first < last:#print("2first = %d  last = %d"%(first,last))mid = math.trunc((first+last)/2) #必须拿到整数,晕死self.mergeSort(L,first,mid)self.mergeSort(L,mid+1,last)self.mergeInL(L,first,mid,last)#代码简洁效率高~~改天实现改进版的def quickSort(self,L,left,right):i = leftj = rightmiddle = L[left]while i<=j:while L<middle and i<right:i += 1while L[j]>middle and j>left:j -= 1if i<=j: #命中一对temp = LL = L[j]L[j] = tempi += 1j += 1if left<j:self.quickSort(L,left,j)if right > i:self.quickSort(L,i,right)def __bucketInit(self):l0 = []l1 = []l2 = []l3 = []l4 = []l5 = []l6 = []l7 = []l8 = []l9 = []bucket = [l0,l1,l2,l3,l4,l5,l6,l7,l8,l9]return bucket#基数排序def radixSort(self,L):radix = 10base = 1bucket = self.__bucketInit()max = L[0]for i in L:if i > max:max = iwhile math.trunc((max%radix)/base) > 0:#放到桶里for i in L:index = math.trunc((i%radix)/base)bucket[index].append(i)#重新整理回LL = []for i in bucket:L.extend(i)bucket = self.__bucketInit()print(L)#下一轮循环取下一位radix *= 10base *=10return L#计数排序def countSort(self,L):size = len(L)min = max = L[0]#拿到最大和最小for i in L:if i<min:min = iif i>max:max = i#得到数字的区间bound = max - min +1#初始化计数数组count =[]for i in range(0,bound):count.append(0)#统计每个数出现的次数,放到count中for i in range(0,size):count[ L-min ] +=1z = 0print("min = %d and max = %d"%(min,max))for i in range(min,max+1):#print("i="+str(i))for j in range(0,count[i-min]):#count[i-min]表示该数字出现次数,0次地话不处理,多次的话依次插入#print("j="+str(j))L[z] = iprint(L)z+=1print(L)a = sort()l = [3,2,5,7,1,9]print('原始数组')print(l)print('选择排序')a.selectSort(l)l2 = [3,2,5,7,1,9]print('插入排序')a.insertSort(l2)print('冒泡排序')l3 = [3,2,5,7,1,9] a.bubbleSort(l3)print('列表归并算法 没有问题')la = [1,3,5,7,9,11]lb = [2,4,6,8]print(a.merge(la,lb))print('归并排序')lm = [3,2,5,7,1,9]a.mergeSort(lm,0,5)print(lm)print('快速排序')lq = [3,2,5,7,1,9]a.quickSort(lq,0,5)print(lq)print('基数排序')lr = [3,20,5,713,1,9]print(lr)a.radixSort(lr)print("计数排序")lz = [3,2,5,7,1,9]a.countSort(lz)

运行结果:
DSC0000.gif

运维网声明 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-373004-1-1.html 上篇帖子: (转)Python OptionParser使用说明 下篇帖子: eclipse中安装python插件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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