代码如下: 快排

'''

几乎是我们学习排序入门算法了,两次遍历,时间复杂度较高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十大排序算法相关推荐

  1. python实现排序算法_python实现各种排序算法

    冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...

  2. python实现希尔排序算法_python实现希尔排序算法

    希尔排序是插入排序的一种又称"缩小增量排序",是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法 ...

  3. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  4. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  5. 基本算法研究1-冒泡排序算法测试

    基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于 ...

  6. java排序算法大全_各种排序算法的分析及java实现

    排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于要找工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究 ...

  7. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  8. 第29讲 常见算法(查找算法、递归算法、排序算法)

    文章目录 查找算法 1. 基本查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 5. 分块查找 6. 哈希查找 7. 树表查找 递归算法 排序算法 1. 冒泡排序 2. 选择排序 3. 插入排 ...

  9. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  10. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

最新文章

  1. 与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势
  2. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 题解(除了C、G之后补)
  3. 04Strategy(策略)模式
  4. 语音合成(文字转语音)工具大全
  5. [转] Firefox 24.0中的插件激活提示
  6. 条款13:以对象管理资源
  7. node.js学习笔记(21) express日志
  8. CodeForces - 1457D XOR-gun(位运算+暴力)
  9. Spark MLlib实现的广告点击预测–Gradient-Boosted Trees
  10. (转载)HTTP与RPC的区别
  11. GARFIELD@02-24-2005
  12. 淘宝开放API,很不错
  13. jenkins访问地址_运维机器人hubot集成jenkins
  14. python基本运算符
  15. 理解Java主函数中的String[] args
  16. window 下 git SERVER 自动部署/生成更新项目 批处理
  17. FlyMcu 串口无法打开 串口被占用
  18. ubuntu18.04安装monaco字体
  19. java多用户商城系统——支持springcloud
  20. 关于VO、RVO、ORCA的个人理解

热门文章

  1. document.body 与 document.documentElement区别介绍
  2. Discuz 7.2 /faq.php SQL注入漏洞
  3. 使用CCDirector的notificationNode来创建独立的信息提示层
  4. IE6 透明遮挡falsh解决方案
  5. JVM分代垃圾回收策略的基础概念
  6. 如何修改Struts2 FiledError样式
  7. 页面中动态画有超连接的图
  8. 大话云时代rac_网易Q1财报中的增长信号:有道和云音乐如何打通“任督二脉”?...
  9. 从零开始学前端:显示隐藏与文本溢出 --- 今天你学习了吗?(CSS:Day16)
  10. php写好的接口怎么返回数据库,用PHP开发app接口,连接了数据库,调试的时候正常输出,但是转为json格式返回的数据为null...