Python实现常用排序算法总结
来源:互联网 发布:mac上编写c语言的软件 编辑:程序博客网 时间:2024/06/13 12:04
一、概述
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
1. 交换排序之冒泡排序(Bubble Sort)
冒泡排序的时间复杂度是O(N^2)
冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置
冒泡排序原理: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)
比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, 对相邻的两位进行比较
第一趟:
第一次比较: 35, 12, 99, 18, 76
第二次比较: 35, 99, 12, 18, 76
第三次比较: 35, 99, 18, 12, 76
第四次比较: 35, 99, 18, 76, 12
经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
第二趟
99, 35, 76, 18, 12
第三趟
99, 76, 35, 18, 12
第四趟
99, 76, 35, 18, 12
比较完成
冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置
冒泡排序原理: 每一趟只能将一个数归位, 如果有n个数进行排序,只需将n-1个数归位, 也就是说要进行n-1趟操作(已经归位的数不用再比较)
比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, 对相邻的两位进行比较
第一趟:
第一次比较: 35, 12, 99, 18, 76
第二次比较: 35, 99, 12, 18, 76
第三次比较: 35, 99, 18, 12, 76
第四次比较: 35, 99, 18, 76, 12
经过第一趟比较后, 五个数中最小的数已经在最后面了, 接下来只比较前四个数, 依次类推
第二趟
99, 35, 76, 18, 12
第三趟
99, 76, 35, 18, 12
第四趟
99, 76, 35, 18, 12
比较完成
#!/usr/bin/env python# coding:utf-8def bubbleSort(lists): count=len(lists) for i in range(count-1): # 这个循环负责设置冒泡排序进行的次数 for j in range(count-i-1): # j为列表下标 if lists[j] > lists[j+1]: lists[j], lists[j+1] = lists[j+1], lists[j] return listslists = [43,19,28,38,56,73,99,49,66]print (bubbleSort(lists))
2.交换排序之快速排序(Quick Sort)
基本思想:1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
lists=[55,46,37,99,16,81,73,61,19,49]def quick_sort(lists, left, right): # 快速排序 if left >= right: return lists key = lists[left] low = left high = right while left < right: while left < right and lists[right] >= key: right -= 1 lists[left] = lists[right] while left < right and lists[left] <= key: left += 1 lists[right] = lists[left] lists[right] = key quick_sort(lists, low, left - 1) quick_sort(lists, left + 1, high) return lists print quick_sort(lists, left=0, right=len(lists)-1)
3.归并排序(merge sort)
基本思想:
归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。
lists = [43,19,28,38,56,73,99,49,66] def merge(left, right): i, j = 0, 0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return result def merge_sort(lists): # 归并排序 if len(lists) <= 1: return lists num = len(lists) / 2 left = merge_sort(lists[:num]) right = merge_sort(lists[num:]) return merge(left, right) print merge_sort(lists)
4.插入排序之直接插入排序(Straight Insertion Sort)
阅读全文
0 0
- Python实现常用排序算法总结
- python实现常用排序算法
- python实现常用排序算法
- 排序算法总结-python实现
- 常用排序算法的Python实现
- 常用排序算法C++ && Python实现
- 常用排序算法的Python实现
- 常用排序算法的Python实现
- 常用排序算法总结---Java实现
- 八大排序算法总结以及python实现
- 排序算法总结(python实现)
- 总结!python数据结构排序算法的实现
- 排序算法总结(简单选择排序、堆排序)(python实现)
- 排序算法总结(归并排序、快速排序)(python实现)
- python常用排序算法
- 常用排序算法总结
- 常用排序算法总结
- 常用排序算法总结
- Unity5.X AssetBundle创建MD5文件
- 详解Struts2拦截器机制
- Node.js项目学习笔记
- windows程序设计——视窗和讯息
- select count (1)
- Python实现常用排序算法总结
- 小程序----应用(3)
- 渲染类
- dispatch_once造成的死锁----分析、解决与自动检测
- Unity5.X AssetBundle检测资源更新
- 初级前端应该懂的东西
- php开发时Linux常用命令
- Kotlin介绍
- 网关、路由、dns