排序算法python实现
来源:互联网 发布:弹幕视频网站源码 编辑:程序博客网 时间:2024/05/16 03:18
#冒泡排序def bubble_sort(lists): # 冒泡排序 #如果i > j就交换 就可以保证i的值是最小的 count = len(lists) for i in range(0, count): for j in range(i + 1, count): if lists[i] > lists[j]: #注意这里是i 与j 比较 这样就可以把最小的值放到最前面 lists[i], lists[j] = lists[j], lists[i] return listsdef my_bubble_sort(): #按照c的方法实现 一样的效果 a = [9, 10, 5, 6, 1, 5, 9, 12, 9, 5] len = len(a) for i in range(len - 1): for j in range(len - i - 1): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] print(a)#快速排序def quick_sort(list,left,right): #right=len-1 if left>=right: return list key=list[left] #这里记得把left right存起来 因为后面会改变其值 而递归调用会用到这个没有改变的值 low=left high=right while left<right: while left < right and list[right] >= key: #这里必须加等号 否则会死循环 right -= 1 list[left] = list[right] while left < right and list[left] <= key: left += 1 list[right] = list[left] list[right]=key quick_sort(list,low,left-1) quick_sort(list,left+1,high) return list#堆排序的实现 完全按照c++的算法写的#完成对一个父节点位置的放置 放置为还满足最小堆def adjust_heap(list,p,len): #p为父节点 len为长度 lchild=2*p+1 #左孩 currentp=list[p] #保存父节点 避免被替换 方便比较 while lchild<len: if lchild+1<len and list[lchild]>list[lchild+1] : lchild+=1 if currentp>list[lchild]: list[p]=list[lchild] p=lchild #更新父节点 lchild=2*p+1 #更新子节点 else: break #这个不能省去 list[p]=currentp #把父节点放在正确的位置上 return listdef heap_sort(list,len): #初始化堆为最小堆 for i in range(len//2)[::-1]: #加这个就可以逆序 从最后一个父节点开始 list=adjust_heap(list,i,len) print(list) #交换首尾值 这样得到的序列为逆序 及最小堆 得到的结果是从大到小的排序 for j in range(len)[::-1]: list[0],list[j]=list[j],list[0] list=adjust_heap(list,0,j) print(list)#插入排序def insert_sort(list): for i in range(len): temp=a[i] j=i-1; while j>=0: if list[j]>temp:# 每次循环的时候都把j+1 和 j都填充上去,j+1填j j填temp#如果不满足temp该放的位置 则下次的时候j会被j-1覆盖掉 直到正确的位置 list[j+1]=list[j] list[j]=temp j-=1 return list#希尔排序def shell_sort(list): gap=len//2 while gap>=1: for i in range(gap): j=i+gap while j<len: k=j-gap key=list[j] while k>=0: if list[k]>key: list[k+gap]=list[k] list[k]=key k-=gap j+=gap gap//=2 return list#归并排序def merge(a,b): #归并 i,j=0,0 c=[] while i<len(a) and j<len(b): if a[i]<b[j]: c.append(a[i]) #这里得用append函数 因为c声明的时候没有声明数量 i+=1 else: c.append(b[j]) j+=1 c+=a[i:] #把剩余没有比较的加进去 c+=b[j:] return cdef merge_sort(list): if len(list)<=1: #用来终止递归 return list d=len(list)//2 a=list[:d] #不断分为两部分 b=list[d:] a=merge_sort(a) #递归 并返回结果 b=merge_sort(b) return merge(a,b)#桶排序 没有采用链表,采用了较多的桶 相同的数放在一个桶中def bucket_sort(data): buckets=[0]*(max(data)-min(data)+1) for i in data: buckets[i]+=1 j=0 for i in range(len(buckets)): while buckets[i]!=0: data[j] =i buckets[i]-=1 j+=1 return data#基数排序 与c++一致 在每一位的排序时用桶排序#import math import copydef radix_sort(data): result=[0]*len(data) k=math.ceil(math.log(max(data),10)) for i in range(k): #循环每一位 count = [0] * 10 #不要忘记了每次都把count清零 否则会下标越界 for j in data: #计数 d=(j//(10**i))%10 count[d]+=1 for j in range(1,10): #计算位置 count[j]+=count[j-1] for j in data[::-1]: d = (j // (10 ** i)) % 10 result[count[d]-1]=j #关键的一步 排序 count[d]-=1 data=copy.deepcopy(result) #采用深复制 return data#选择排序def select_sort(data): n=len(data) for i in range(n): p=data[i] index=i for j in range(i+1,n): if(p>data[j]): index=j p=data[j] if index!=i: data[i],data[index]=data[index],data[i] return data#计数排序和桶排序一致(和不适用链表的桶排序)
2017-10-16
排序算法的python实现 初版 自己写的 参考的c++ 不太优化
阅读全文
0 0
- 排序算法python实现
- 排序算法Python实现
- Python实现排序算法
- 排序算法python实现
- 直接排序算法python实现
- python 实现插入排序算法
- 基本排序算法:Python实现
- python实现各种排序算法
- python实现排序算法目录
- 排序算法总结-python实现
- python实现常见排序算法
- Python实现快速排序算法
- python实现快速排序算法
- Python:经典排序算法实现
- python实现经典排序算法
- python实现各种排序算法
- python实现各种排序算法
- python实现常用排序算法
- [PAT]1019. General Palindromic Number (20)@Java
- Linux:静态函数库(.a)与动态函数库(.so)
- HorizontalScrollView动态添加item居中问题
- 3.类.对象
- 第四周 项目一 建立单链表
- 排序算法python实现
- 课后练习题(第一章)
- 神经网络和深度学习笔记(一)
- java项目中Classpath路径到底指的是哪里?
- CSS实现画出多种图形
- JDK8中ThreadLocal源码解析
- AngularJS自定义服务
- C++学习——泛型编程
- 树莓派Pi2安装ROS Kinetic Kame开发环境(基于Ubuntu 16.04LTS)