python的十大算法_Python十大排序算法
代码如下: 快排
'''
几乎是我们学习排序入门算法了,两次遍历,时间复杂度较高n*n,稳定排序
'''
def bubbleSort(tmpList):
for i in range(len(tmpList)-1):
for j in range(len(tmpList)-1,i,-1):
if tmpList[j-1] > tmpList[j]:
tmpList[j-1],tmpList[j] = tmpList[j],tmpList[j-1]
print(tmpList)
bubbleSort([9,8,7,6,5,4,3,2,1])
'''
选择排序:思想就是 当当前数跟后面所以对比,然后找到最小的。这两个点进行交换。
331 -> 133 不稳定排序 时间复杂度n*n
'''
def selectSort(tmpList):
for i in range(len(tmpList) - 1):
minIndex = i
for j in range(i+1,len(tmpList)):
if tmpList[j] < tmpList[i]:
minIndex = j
if minIndex != i:
tmpList[i],tmpList[minIndex] = tmpList[minIndex],tmpList[i]
print(tmpList)
selectSort([9,8,7,6,5,4,3,2,1])
'''
插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
时间复杂度 n*n 稳定。
'''
def InsertSort(tmpList):
for i in range(1,len(tmpList)):
key = tmpList[i]
a = i
while key < tmpList[a-1]:
tmpList[a] = tmpList[a-1]
a = a-1
if a - 1 < 0:
break
tmpList[a] = key
print(tmpList)
InsertSort([9,8,7,6,5,4,3,2,1])
'''
希尔排序: 每次将相同间隔的数组成一个小数组,然后用插入排序实现, 时间复杂度为 nlgn 不稳定
'''
def ShellSort(tmpList):
step = len(tmpList)//2
while step > 0:
for i in range(step):
j = i + step
while j < len(tmpList):
a = j
key = tmpList[j]
while key < tmpList[a - step]:
tmpList[a] = tmpList[a - step]
a = a - step
if a - step < 0:
break
tmpList[a] = key
j += step
step = step//2
print(tmpList)
ShellSort([9,8,7,6,5,4,3,2,1])
'''
堆排:思想来自于二叉树,还是完全二叉树,有大根堆(从小到大),小根堆(从大到小)。
先建立完全二叉树,建立的思路就是 大根堆或者小根堆的定义。
建好后,每次将当前最大数 挪到根节点,然后将根节点跟最后节点数据实现互换,如此循环执行即可。
'''
def adjustHeap(tmpList,i,size):
left = 2*i+1
right = 2*i+2
max = i
if i < size//2:
if left < size and tmpList[left] > tmpList[max]:
max = left
if right < size and tmpList[right] > tmpList[max]:
max = right
if max != i:
tmpList[max],tmpList[i] = tmpList[i],tmpList[max]
adjustHeap(tmpList,max,size) # 数据互换后要考虑 i 下面根节点的影响。
def buildHeap(tmpList,size): # 建立一个 大根堆
for i in range((size)//2,0,-1):
adjustHeap(tmpList,i,size)
def heapSort(tmpList):
size = len(tmpList)
buildHeap(tmpList,size)
for i in range(0,size)[::-1]:
tmpList[i],tmpList[0] = tmpList[0],tmpList[i]
adjustHeap(tmpList,0,i)
print(tmpList)
heapSort([9,8,7,6,5,4,3,2,1])
'''
归并排序: 分治的思想,将数据分成若干小的组合,然后组合与组合两两排序,排序后的组合再两两排序,
深度遍历的思想 DFS, 这样的函数通常都包含递归调用的思想 不稳定
'''
def merge(left,right):
ans = []
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
ans.append(left[i])
i += 1
else:
ans.append(right[j])
j += 1
ans += left[i:] + right[j:]
return ans
def mergeSort(tmpList):
size = len(tmpList)
if size < 2:
return tmpList
mid = size // 2
left = mergeSort(tmpList[:mid])
right = mergeSort(tmpList[mid:])
return merge(left,right)
print(mergeSort([9,8,7,6,5,4,3,2,1]))
'''
快排:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,不稳定
'''
def subSort(tmpList,left,right):
key = tmpList[left]
while left < right:
while left < right and tmpList[right] >= key:
right -= 1
tmpList[left] = tmpList[right] # 理解下 减少不必要的数据交换
while left < right and tmpList[left] <= key:
left += 1
tmpList[right] = tmpList[left] # 理解下 减少不必要的数据交换
tmpList[left] = key
return left # 返回中间数的索引
def quickSort(tmpList,left,right):
if left < right:
keyIndex = subSort(tmpList,left,right)
quickSort(tmpList,left,keyIndex)
quickSort(tmpList,keyIndex+1,right)
tmpList = [5,1,9,3,7,4,8,6,2]
quickSort(tmpList,0,len(tmpList)-1)
print(tmpList)
'''
!!! 计数排序、基数排序、桶排序则属于非比较排序,算法时间复杂度O(n),优于比较排序。但是也有弊端,会多占用一些空间,有特定的数据要求,不能是负数,不能是小数,相当于是用空间换时间。
'''
'''
桶排:通排序非常浪费空间, 比如需要排序的范围在0~2000之间, 需要排序的数是[3,9,4,2000], 同样需要2001个空间
注意: 通排序不能排序小数
'''
def bucketSort(tmpList): # 待排序数组, 最大的筒子,数组的长度
max_num = max(tmpList) # 选择一个最大数
bucket = [0]*(max_num+1) # 创建一个元素全为0的列表当桶
for i in tmpList: # 把所有元素放入桶中,计算该数出现次数
bucket[i] += 1
ans = []
for i in range(len(bucket)):
if bucket[i] != 0: # 如果该数出现的次数大于0
for j in range(bucket[i]): # 出现多少次都将数放入桶中
ans.append(i)
return ans
tmpList = [5,6,3,2,1,65,2,0,8,0]
print(bucketSort(tmpList))
'''
计数排序:基本思想是:对每一个输入的元素a[i],确定小于 a[i] 的元素个数。所以可以直接把 a[i] 放到它输出数组中的位置上。假设有5个数小于 a[i],所以 a[i] 应该放在数组的第6个位置上。
'''
def countSort(tmpList,maxNum): # 呆排序数组,最大值
ans = [0]*len(tmpList)
c = [0]*(maxNum+1)
for i in tmpList:
c[i] += 1
for i in range(1,maxNum+1):
c[i] += c[i-1] #统计每个数字所在的idx
for j in tmpList:
ans[c[j]-1] = j
c[j] = c[j] - 1
return ans
tmpList = [5,6,3,2,1,65,2,0,8,0]
print(countSort(tmpList,max(tmpList)))
def radixSort(tmpList):
n = 1 # 计算数最多多少位
maxNum = max(tmpList)
while maxNum//(10**n) > 0:
n +=1
for i in range(n): # n轮排序
s = [[] for i in range(10)] # 因为没一位数字都是0~9 ,故建立10个桶
# 对于数组中的元素,首先按照最低有效数字进行排序,然后由低位向高位进行
for j in tmpList:
'''对于3个元素的数组[977, 87, 960],第一轮排序首先按照个位数字相同的
放在一个桶s[7]=[977],s[7]=[977,87],s[0]=[960]
执行后list=[960,977,87].第二轮按照十位数,s[6]=[960],s[7]=[977]
s[8]=[87],执行后list=[960,977,87].第三轮按照百位,s[9]=[960]
s[9]=[960,977],s[0]=87,执行后list=[87,960,977],结束。'''
s[j//(10**i)%10].append(j)
tmpList = [j for i in s for j in i]
return tmpList
tmpList = [5,6,3,2,1,65,2,0,8,0]
print(radixSort(tmpList))
python的十大算法_Python十大排序算法相关推荐
- python实现排序算法_python实现各种排序算法
冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...
- python实现希尔排序算法_python实现希尔排序算法
希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...
- 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training
推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...
- 排序算法 - 面试中的排序算法总结
排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...
- 基本算法研究1-冒泡排序算法测试
基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于 ...
- java排序算法大全_各种排序算法的分析及java实现
排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于要找工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究 ...
- 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序
<数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...
- 第29讲 常见算法(查找算法、递归算法、排序算法)
文章目录 查找算法 1. 基本查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 5. 分块查找 6. 哈希查找 7. 树表查找 递归算法 排序算法 1. 冒泡排序 2. 选择排序 3. 插入排 ...
- 算法 经典的八大排序算法详解和代码实现
算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...
- 排序算法:简单选择排序算法实现及分析
简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...
最新文章
- 与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 题解(除了C、G之后补)
- 04Strategy(策略)模式
- 语音合成(文字转语音)工具大全
- [转] Firefox 24.0中的插件激活提示
- 条款13:以对象管理资源
- node.js学习笔记(21) express日志
- CodeForces - 1457D XOR-gun(位运算+暴力)
- Spark MLlib实现的广告点击预测–Gradient-Boosted Trees
- (转载)HTTP与RPC的区别
- GARFIELD@02-24-2005
- 淘宝开放API,很不错
- jenkins访问地址_运维机器人hubot集成jenkins
- python基本运算符
- 理解Java主函数中的String[] args
- window 下 git SERVER 自动部署/生成更新项目 批处理
- FlyMcu 串口无法打开 串口被占用
- ubuntu18.04安装monaco字体
- java多用户商城系统——支持springcloud
- 关于VO、RVO、ORCA的个人理解
热门文章
- document.body 与 document.documentElement区别介绍
- Discuz 7.2 /faq.php SQL注入漏洞
- 使用CCDirector的notificationNode来创建独立的信息提示层
- IE6 透明遮挡falsh解决方案
- JVM分代垃圾回收策略的基础概念
- 如何修改Struts2 FiledError样式
- 页面中动态画有超连接的图
- 大话云时代rac_网易Q1财报中的增长信号:有道和云音乐如何打通“任督二脉”?...
- 从零开始学前端:显示隐藏与文本溢出 --- 今天你学习了吗?(CSS:Day16)
- php写好的接口怎么返回数据库,用PHP开发app接口,连接了数据库,调试的时候正常输出,但是转为json格式返回的数据为null...