部分排序算法的基本思想及用python3 实现
来源:互联网 发布:bbs网络论坛系统uml 编辑:程序博客网 时间:2024/04/29 06:43
排序算法虽然在平常的工作中也许用不到,但是对于加强自身的逻辑思维能力以及加深对数据结构的理解有不错的效果。下面是用python3实现的部分排序算法。
1.冒泡排序法
冒泡排序的基本思想是将相邻的元素进行比较,如果是从小到大排序的话,则将小的元素放在左边,这种排序的思想很像水中的气泡上浮,所以称为冒泡排序。
def bubble_sort(alist): """冒泡排序""" n = len(alist) # 2. 控制遍历的次数 for j in range(n-1): # 1 # 1. 先控制角标 i 的变化 exchange = False for i in range(0,n - 1 - j): # 判断角标 i 和 i+1对应的值的大小 if alist[i] > alist[i+1]: # 交换 alist[i],alist[i+1] = alist[i+1],alist[i] exchange = True if not exchange: break
选择排序的基本思想是从无序序列中遍历出最小的元素,放在序列的第一个位置,即下标为0的位置,然后再次遍历,从剩下的元素中再次找到最小的元素,放在下标为1的位置,依次类推,最终完成排序。
def select_sort(alist): """选择排序""" n = len(alist) # 控制比较的次数 for j in range(n-1): # 控制角标 min_index = j for i in range(1+j,n): # 比较 if alist[i] < alist[min_index]: # 修改 min_index 对应的值 min_index = i if min_index != j: # 交换 alist[min_index],alist[j] = alist[j],alist[min_index]
3.插入排序
插入排序的基本思想是将一个序列看成两部分:左边的部分是有序序列,右边的是待排序序列。每次分别比较有序和待排序序列元素的大小,然后插入到合适位置,完成排序。
def insert_sort(alist): """插入排序""" n = len(alist) for j in range(1,n): for i in range(j,0,-1): if alist[i] < alist[i - 1]: # 交换 alist[i],alist[i-1] = alist[i-1],alist[i] else: break
希尔排序实际上是对插入排序的一个优化排序算法,先通过将源序列按某个下标增量分割成若干子序列,分别进行插入排序,然后让下标增量递减,每个子序列中的关键字就会增加,当增量递减为1时,再进行一次插入排序,完成了排序。
def shell_sort(alist): n = len(alist) # 控制增量的变化 gap = n // 2 while gap >= 1: # shell 排序是对于插入排序的优化 for i in range(gap, n): while (i - gap) >= 0: if alist[i] < alist[i - gap]: # 交换 alist[i], alist[i - gap] = alist[i - gap], alist[i] # 交换完毕之后就应该修改 i i = i - gap else: break gap = gap // 2
快速排序的基本思想是取序列中的一个元素作为"基准",然后将比该"基准"小的元素放在它左边,将比它大的元素放在右边,和它相等的元素放在任意一边均可,想放哪边全由编写代码时决定,然后通过递归调用,对两边的序列分别排序,最终变成有序序列。
ef quick_sort(alist,start,end): # 自己的调用自己,退出递归的条件 maximum recursion depth exceeded in comparison if start > end: # 结束递归 return n = len(alist) left = start right = end base_value = alist[left] while left < right: # = 添加任何一个判断都可以,但是 '=' 决定了相同的基准值应该放在哪一边 while left < right and alist[right] >= base_value: right -= 1 # 退出循环 将 right 角标对应的值设置给 left 角标 alist[left] = alist[right] while left < right and alist[left] < base_value: left += 1 # 将 left 角标对应的值设置给 right 角标 alist[right] = alist[left] # 退出循环 left = right alist[left] = base_value # 递归调用 # quick_sort(alist[:left]) # quick_sort(alist[left+1:]) # 先对于左变的序列完成快速排序 quick_sort(alist,start,left-1) quick_sort(alist,left + 1,end)
以上就是本次博客的全部内容了,由于是初次写博客,多多包涵,有不正确的地方还请指正。
阅读全文
1 0
- 部分排序算法的基本思想及用python3 实现
- 排序算法之堆排序、基数排序和归并排序的思想及部分实现
- 关于排序算法的思想及实现
- 快速排序_算法基本思想及实现
- 排序算法的基本思想
- 总结八大排序算法的基本思想与代码实现
- 快速排序的基本思想及Java实现
- 堆排序(基本思想以及算法实现)
- 归并排序(基本思想以及算法实现)
- 快速排序(基本思想以及算法实现)
- 选择排序基本思想及实现
- 直接插入排序算法的思想及java实现
- 浅析常用排序算法的思想及实现
- 各种排序算法的思想、效率及实现
- 排序算法基本思想
- 基本排序算法思想
- 排序算法思想及Java实现
- 希尔排序算法思想及实现过程
- myeclipse创建简单maven工程时,如何将普通文件夹部署为web功能的文件夹(add dynamic web module)
- 数据结构——链表、栈和队列
- 集合(树)连通
- appium+python官方sample code(一)
- 利用CoreAnimation实现一个时间的进度条
- 部分排序算法的基本思想及用python3 实现
- C++中理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异(11)---《More Effective C++》
- 关于eclipse上部分快捷键失效问题的解决方法
- 直接插入排序
- linux内核网络栈---socket调用内核路径
- HDU6186 | 2017广西邀请赛 CS Course (前缀和后缀)
- servlet:请求转发与重定向
- Mysql 常用查询性能优化
- 可持久化Treap