python 冒泡排序,快排
一、冒泡排序
1.1、冒泡的原理
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2.1、冒泡排序的代码实现
def bubble_sort(seq):
count=len(seq)
for i in range(0,count):
for j in range(i+1,count):
if seq[i]>seq[j]:
seq[i],seq[j]=seq[j],seq[i]
return seq
seq=[4,5,2,1,6,3]
print(bubble_sort(seq))
3.1、冒泡排序的时间复杂度
1、最好情况:若文件的初始状态是正序的,一趟扫描即可完成排序,这是冒泡排序的最优情况时间复杂度o(n)
2、最坏情况:若初始文件是反序的的,则冒泡排序需要两层循环,这是最坏情况时间复杂度o(n^2)
3、平均时间复杂度o(n^2)
二、快排
2.1 快排原理
快排是冒泡排序的改进,抽取第一个值作为比较值,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比比较值小,另一部分比比较值大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最后将分开的来两部分加比较值合并到一起,完成排序。
2.2 快排的代码实现
def quck_sort(seq):
if seq==[]:
return []
else:
pivot=seq[0]
low_list=quck_sort([x for x in seq if x<pivot]) #比比较值小的部分递归排序
upper_list=quck_sort([x for x in seq if x>pivot])#比比较值大的部分递归排序
return low_list+[pivot]+upper_list #将三者进行合并,注意将比较值转换成列表
print(quck_sort(seq))
2.3 快排的时间复杂度
1、最优情况:比较值刚好将列表分成等分了两部分,时间复杂度o(nlogn)
2、最坏情况:每次递归比较值都是最小值,导致列表分开不均衡,时间复杂度o(n^2)
3、平局时间复杂度o(nlogn)
三、堆排序
堆排序原则,1.先对数据进行建堆操作(可以建大根堆或小根堆) 大跟堆:任一节点都比其孩子节点大
2.再对建好的堆进行出树据操作,交换堆顶元素和末尾元素并重建堆两部分组
def shit(li,low,high): #建堆
#li表示树,low表示树跟,high 表示最后一个节点的位置
temp=li[low]
i=low #i指向调整为起始为0
j=2*i+1 #左孩子的位置
while j<=high:
if j+1<=high and li[j]<li[j+1]: #如果右孩子存在,且右孩子比左孩子大,j指向右孩子
j+=1
if li[j]>temp: #比较跟节点值和新指向j的大小
li[i]=li[j] #如果j的值大于temp,跟节点和孩子节点位置互换,i位置调整到j的位置
i=j
j=2*i+1 #得出调整后新的j的位置
else: #循环推出的条件,temp值比两个孩子均大,不做调整
break
li[i]=temp
def heap_sort(li):
n=len(li)
#1.构造堆
for low in range(n//2-1,-1,-1):
shit(li,low,n-1)
#2.挨个出数
for high in range(n-1,-1,-1):
li[0],li[high]=li[high],li[0] #树顶的数据跟尾部数据交换,
shit(li,0,high-1) #每次循环high的位置多一个大的数字,位置调整一次,剩余的部分再建堆 arr1=[1,4,3,6,5,8,2,7]
heap_sort(arr1)
print(arr1)
其中构建初始堆经推导复杂度为O(n),在交换并重建堆的过程中,需交换n-1次,而重建堆的过程中,根据完全二叉树的性质,[log2(n-1),log2(n-2)...1]逐步递减,近似为nlogn。所以堆排序时间复杂度一般认为就是O(nlogn)级。
python中heapq模块是堆排序模块,他建立的堆属于小根堆,用法如下:
import heapq
li=[1,3,2,6,4,7,5,9,8]
heapq.heapify(li) #建堆(小根堆)
heapq.heappush(li,0)#向队中加入一个数字,会自动做重新建堆操作
heapq.heappop()#从堆中取数据,由于其建的是小根堆,最后出的是0
python 冒泡排序,快排的更多相关文章
- Python的快排应有的样子
快排算法 简单来说就是定一个位置然后,然后把比它小的数放左边,比他大的数放右边,这显然是一个递归的定义,根据这个思路很容易可以写出快排的代码 快排是我学ACM路上第一个让我记住的代码,印象很深 ...
- Python实现快排
Python实现快排 def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x ...
- Python随笔-快排
def swap(arr, i, j): temp = arr[i] arr[i] = arr[j] arr[j] = temp def part(arr, beg, end): : return b ...
- python 冒泡和快排,不多说【无聊】
#-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...
- php中实现快排与冒泡排序
快排 <?php function quicksort($str){ if(count($str)<=1) return $str;//如果个数不大于一,直接返回 $key=$str[0] ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- 快排(python)
用python写了个快排,第一次发现python居然可以这么简洁. def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[le ...
- python 冒泡和快排,不多说
#-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...
- 快排的python实现
快排的python实现 #python 2.7 def quick_sort(L): if len(L) <= 1: return L else: return quick_sort([lt f ...
随机推荐
- Qt安装教程
一.Qt下载 官网下载链接http://download.qt.io/archive/qt/,下载最新版 5.10 官网的下载网站有的时候可能会抽风,也可以选择国内的镜像下载源http://mirro ...
- 为什么表单中post接受数据是获取name值而不是id值
感谢解惑者:http://blog.csdn.net/u013451157/article/details/78503831 表单(form)的控件名,提交的数据都用控件的name而不是id来控制. ...
- SAP成都研究院C4C光明左使:SAP Cloud for Customer 使用SAP UI5的独特之处
大家好,今天的文章来自我的同事,Yang Joey. 2017年7月,SAP成都研究院C4C开发团队刚刚建立.某个周一早晨的Scrum meeting,新出现一位眉清目秀的小伙子,向大家自我介绍:&q ...
- fiddle连接终端测试配置
第一次做app,对app的数据要进行一些数据抓包和数据分析,知道客户端发送到服务器端的过程和逻辑,通过抓包了解和分析出错,前提要先连接fiddle
- Aizu 0525 Osenbei(状压+贪心)
题意:翻煎饼,只能横着翻或者竖着翻.问最多有多少朝上? 行只有10,所以枚举一下2^10的状态,每列取0或1中最大的一个. 在枚举外面把饼翻好,枚举里面指针指一下就好.(位运算或bitset乱搞 #i ...
- 用ComboBox控件制作浏览器网址输入框
实现效果: 知识运用: ComboBox控件的FindString public int FindString(string s) //查找数据项集合中指定数据项的索引 和Select方法 publi ...
- 实现带复选框的TreeView控件
实现效果: 知识运用: TreeView控件的CheckView属性 //是否在树形视图控件中显示复选框 public bool CheckBoxs{ get;ser } 实现代码: TreeView ...
- Opentsdb简介
1.OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Datab ...
- linux用命令行运行matlab的.mat文件
入m文件所在目录后,运行 $ matlab -nodesktop -nosplash -r matlabfile 只用文件名matlabfile,不能添加.m
- vue中v-show和v-if的异同
一.官方解释: v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次 ...