8大排序之Python实现 冒泡排序优化
1.冒泡排序(从大到小):交换发生在内部循环
稳定的排序
冒泡排序的平均时间复杂度是O(n2),最好的时间复杂度是O(n),最坏的时间复杂度是O(n2),空间复杂度为O(1)
冒泡排序的优化在于didswap变量 ,通过这个变量的设置,实现冒泡排序的最好时间复杂度是O(n)
#!usr/bin/python
arr=[1,2,3,4,5,6,7,8,67,5,64,43,546,56,76,34,657,34,45,56,23]
def BubbleSort(list):
for i in range(len(list)-1):
didswap = False
for j in range(len(list)-1-i):
if list[j]<list[j+1]:
list[j],list[j+1]=list[j+1],list[j]
didswap =True
if didswap == False:
return list
return list
print (BubbleSort(arr))
2.选择排序(从大到小):交换发生在外部循环
不稳定的排序
平均算法复杂度O(n2),最好算法复杂度O(n2),最坏的算法复杂度为O(n2),空间复杂度O(1)
#!usr/bin/python
def SelectSort(lists):
for i in range(len(lists)-1):
max=i
for j in range(i+1,len(lists)):
if lists[j]>lists[max]:
max=j
lists[max],lists[i]=lists[i],lists[max]
return lists lists=[2,3,4,65,7,6,5,5,6,7,8,6,4]
print SelectSort(lists)
3.插入排序(从大到小排序):
稳定的排序
平均复杂度O(n2),最好的时间复杂度O(n),最坏的算法复杂度O(n2),空间复杂度是O(1)
#!usr/bin/python
def InsertSort(lists):
for i in range(1,len(lists)):
key=lists[i]
j=i-1
while j>=0 and lists[j]<key:
lists[j+1]=lists[j]
j=j-1
lists[j+1]=key
return lists
arr=[2,3,4,5,6,8,7,5,6,7,6,4,5,6,7,8,7,5]
print InsertSort(arr)
4.归并排序(从大到小):归并排序的思想就是分而治之
归并排序是稳定
平均O(nlgn) 最好的时间复杂度是O(nlgn),最坏的时间复杂度是O(nlgn),空间复杂度是O(n)
#!usr/bin/python
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 MergeSort(lists):
if len(lists)<2:
return lists
div = len(lists)/2
left=MergeSort(lists[0:div])
right=MergeSort(lists[div:])
return Merge(left,right) lists = [2,3,4,5,6,7,6,5,34,23,4,56,6,3,4,6]
print MergeSort(lists)
5.快速排序:(递归调用)
平均时间复杂度O(nlgn),平均时间复杂度O(nlgn),最坏的时间复杂度O(n2)
空间复杂度O(lgn)-Olg(n)
def QuickSort(myList,start,end):
#判断low是否小于high,如果为false,直接返回
if start < end:
i,j = start,end
#设置基准数
base = myList[i]
while i < j:
#如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
while (i < j) and (myList[j] >= base):
j = j - 1
#如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
myList[i] = myList[j]
#同样的方式比较前半区
while (i < j) and (myList[i] <= base):
i = i + 1
myList[j] = myList[i]
#做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
myList[i] = base #递归前后半区
QuickSort(myList, start, i - 1)
QuickSort(myList, j + 1, end)
return myList lists = [49,38,65,97,76,13,27,49]
print(QuickSort(lists,0,len(lists)-1))
print (lists)
7.堆排序(从大到小):第一步最小堆化;第二步建立最小堆;第三步堆排序
#!user/bin/python
def AjustHeap(lists,i,size):
min=i
left=2*i+1
right=2*i+2
if i < size/2:
if right < size and lists[min] > lists[right]:
min=right
if left < size and lists[min]>lists[left]:
min=left
if min!=i:
lists[i],lists[min]=lists[min],lists[i]
AjustHeap(lists,min,size)
def BuildHeap(lists,size):
for i in range(0,(size/2))[::-1]:
AjustHeap(lists,i,size)
def HeapSort(lists):
size=len(lists)
BuildHeap(lists,size)
for i in range(0,size)[::-1]:
lists[i],lists[0]=lists[0],lists[i]
AjustHeap(lists,0,i)
return lists
arr=[12,23,4,3,5,6,7,8,76,43,5,6,7,34,3,76]
print HeapSort(arr)
6.希尔排序(从大到小):(插入排序的一种)
#!user/bin/python
def ShellSort(lists):
step=len(lists)/2
while (step>=1):#step终止循环为1
for i in range(step,len(lists)):#没一次step对应很多个新列表
while(i>=step and lists[i] > lists[i-step]):#每个列表进行排序
lists[i],lists[i-step]=lists[i-step],lists[i]
i=i-step
step=step/2
return lists
arr=[12,23,4,3,5,6,7,8,76,43,5,6,7,34,3,76]
print ShellSort(arr)
8.计数排序:
8大排序之Python实现 冒泡排序优化的更多相关文章
- Javascript中,实现十大排序方法之一(冒泡排序及其优化设想)
冒泡排序的Javascript实现 首先定义一个取值范围在(0~100000)之间的随机值的长度为10万的数组, function bubbleSort(arr) { console.time('冒泡 ...
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
最近在准备笔试题和面试题,把学到的东西整理出来,一来是给自己留个笔记,二来是帮助大家学习. 题目: 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: 输入:[1,2,3,5,2, ...
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
- python排序算法之一:冒泡排序(及其优化)
相信冒泡排序已经被大家所熟知,今天看了一篇文章,大致是说在面试时end在了冒泡排序上,主要原因是不能给出冒泡排序的优化. 所以,今天就写一下python的冒泡排序算法,以及给出一个相应的优化.OK,前 ...
- 排序算法入门之冒泡排序及其优化(java实现)
冒泡排序思想(从小到大): 比较相邻两个元素,如果第一个元素比第二个元素大,就交换他们的位置.第一趟,从第一个元素开始,第一个元素和第二个元素比较,如果第一个元素比第二个元素大,则交换位置:接下来比较 ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 一篇夯实一个知识点系列--python实现十大排序算法
写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- 使用 js 实现十大排序算法: 冒泡排序
使用 js 实现十大排序算法: 冒泡排序 冒泡排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!
随机推荐
- 31.【微服务架构】SpringCloud之Feign(五)
Feign简介 Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Fei ...
- 深度优先遍历(DFS)(转)
优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法.早在19世纪就被用于解决迷宫问题. 对于下面的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4 ...
- nginx 相关命令
验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止或关闭Nginx: ...
- oracle pivot
select * from (select a.drugname, a.drugform, a.drugspec, a.type flag, max(a.maxzjprice) maxprice, m ...
- Atlassian - Confluence Security Advisory - 2019-03-20
-------------------- This problem refers to the advisory found at https://confluence.atlassian.com/d ...
- proxysql 系列 ~ 高可用架构
一 整体架构二 proxysql层 proxysql+keepalived对外提供vip 1 这里有一点要注意,虽然keepalived有脑裂危险,但是对于向proxysql这种无状态中 ...
- 假设result是一个float型变量,其值为27.32,value是一个int型变量,其值为15执行以下语句后,两个便利的值分别是多少?为什么?
假设result是一个float型变量,其值为27.32,value是一个int型变量,其值为15执行以下语句后,两个便利的值分别是多少?为什么? 在执行这条语句的过程中,保存在result中的值被读 ...
- SpringSocial简介
⒈常用的pom依赖 <dependency> <groupId>org.springframework.social</groupId> <artifactI ...
- 数据备份、pymysql模块
阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...
- ARMV7-M数据手册---Part B :System Level Architecture---B3 System Address Map
1.前言 2.The system address map 3.System Control Space (SCS) 4.The system timer, SysTick 5. Nested Vec ...