python排序算法大全(附源代码)
python算法源码之排序(附源码)
- 1. 算法认识
- 2. 冒泡排序
- 3. 选择排序
- 4. 插入排序
- 5. 归并排序
- 6.快速排序
- 7.计数排序
1. 算法认识
1.算法是指解决问题的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。都说“程序=算法+数据结构”,虽然是有很多人反驳,但是也能说明算法在程序中的重要性。
2,算法五大特征:
(1)有穷性
算法的有穷性是指算法必须在执行有限个步骤之后终止;
(2)确切性
算法每一步骤必须有确切的定义;
(3)输入项
算法必须有0个或者多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定义了初始条件;
(4)输出项
算法必须有一个或者多个输出,以反映对输出的加工后的结果,没有输出的算法毫无意义;
(5)可行性
算法中执行的每一个步骤都可以被分解为基本的可执行操作步骤,即每一个计算步骤都可以在有限时间内完成;
3,算法评价
(1)时间复杂度
算法的时间复杂度是指执行算法所需的计算工作量;
常见的时间复杂度:O(1), O(n), O(n^2)
(2)空间复杂度
算法的空间复杂度是指一个算法在运行过程中临时占用存储空间大小的量度;
充分利用python代码的优势,尽可能将代码写到简洁,方便,易懂;
2. 冒泡排序
1,总结(助记)
从第一个数开始,与后面数比较,大的放后面,小的放前面,大的再与后面的数比较,依次类推,不断交换,最后将选出第一个最大的数,放在最后;
2,原理
基本原理是比较相邻两个数的大小,将两个数中比较大的那个数交换到靠后的位置,不断地交换下去就可以将最大的数放到队列的尾部,然后重新开始,直到将数列排成有序数列;
举例:
冒泡排序代码:
import randomdef randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000)) # append()函数用于产生随机数存入iList列表中return iList
iList1=randomList(20)
def bubbleSort(iList):"""冒泡排序"""if len(iList1) <=1:return iList1for i in range(1,len(iList1)):for j in range(0,len(iList1)-i):if iList[j] >= iList[j+1]:iList1[j], iList1[j+1] = iList1[j+1], iList1[j]print("第%d轮排序结果为:" %i, end=" ")print(iList1)return iList
if __name__ == "__main__":print(iList1)print("冒泡排序结果:",bubbleSort(iList1))
运行代码结果展示:
3. 选择排序
1, 总结(助记)
某一个数为基数,遍历数列中其他的数字,找出最小的那个数,然后交换这两个数的位置,找到最小或者最大的那个数;
2,原理
冒泡排序是相邻两个数比较,而选择排序则是某个数和数列中其他所有的数进行比较,挑出最小的最小(大)的那个数就可以了;
3,举例演示:
选择排序算法程序
将这个数放到合适的位置,然后在抛开这个数的子数列中找找最大值,知道自数列为空为止。
"""
import randomdef randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000))return iList
iList1=randomList(20)def selectionSort(iList):if len(iList1) <= 1:return iList1for i in range(0,len(iList1)-1):if iList1[i] !=min(iList1[i:]): # 使用min函数找到剩余数列中最小的那个数minIndex = iList.index(min(iList1[i:]))iList1[i], iList1[minIndex] = iList1[minIndex], iList1[i]print("第%d轮排序结果:" %(i+1), end=" ")print(iList1)return iList1if __name__ == "__main__":print(iList1)print("选择排序以后的结果:", selectionSort(iList1))
程序运行结果展示:
4. 插入排序
- 总结:
插入排序就是跟打扑克取牌十分相似,在打扑克时候,每取一张牌,我们都会与手上的牌进行比较,将新牌插入到比自己的小的牌后面,取完牌后手上所有的牌就是一个有序的序列; - 原理
插入排序首先就是将数列分成两部分,数列第一部分为left部分,其他数为right部分,然后将right部分中的数逐一取出来,插入到left部分中合适的位置,当right部分为空时,left部分就成为一个有序的数列; - 举例演示
插入排序算法代码:
"""
插入排序:就是取第一个为left,其他的数为right,然后将right中数取出来,放到合适的位置
"""import randomdef randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000))return iList
iList1=randomList(20)def insertionSort(iList):if len(iList1) <= 1:return iList1for right in range(1, len(iList1)):target = iList1[right]for left in range(0, right):if target <= iList1[left]:iList1[left+1:right+1] = iList1[left:right] # 使用python的切片赋值iList1[left] = targetbreakprint("第%d轮排序结果:" %(right), end=" ")print(iList1)return iList1
if __name__ == "__main__":print(iList1)print("插入排序后的结果:",insertionSort(iList1))
程序代码运行结果显示:
5. 归并排序
- 总结:将排序数列分成若干组,每个数分为一组,将若干个组两两合并,保证合并后的数列是有序的,重复合并,排序完成;
- 原理
归并排序就是首先要做到的是将数列分成左右两部分,最好是等分,然后将左右两个子数排列完毕后再合并到一起的就成为一个有序的数列; - 举例演示:
归并排序算法实现程序
import random
import sys
import timeit
sys.setrecursionlimit(10000)
def randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000))return iList
iList=randomList(20)def mergeSort(iList):if len(iList) <= 1:return iListmiddle = len(iList)//2left,right = iList[0:middle],iList[middle:]return mergeList(mergeSort(left), mergeSort(right))def mergeList(left,right):mList = []while left and right:if left[0] >= right[0]:mList.append(right.pop(0))else:mList.append(left.pop(0))while left:mList.append(left.pop(0))while right:mList.append(right.pop(0))return mListif __name__ =="__main__":print(iList)print("排序后的结果:",mergeSort(iList))print(timeit.timeit("mergeSort(iList)","from __main__ import mergeSort,iList",number=100))
程序运行结果展示:
6.快速排序
- 总结
快速排序算法是一种递归排序,用最简单的方法来解决复杂的问题,唯一不太好的地方就是稍微有点浪费时间; - 原理
从列表中的意一个数为基准,将列表中分为左右的两个子列表:左边子列表的数要比基数小,右边子列表的数要比基数大;
然后继续把左边子列表和右边子列表按同样的方法继续分解比较,一直到分无可分为止,最后按照 左子列表数(比基数小)+基准数 + 右边子列表数(比基数大)方式连接起来,
- 举例演示:
快速排序算法实现代码
import random
import timeit
import sys
sys.setrecursionlimit(10000)
def randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000)) # append()函数用于产生随机数存入iList列表中return iList
iList=randomList(20)
def quickSort(iList):if len(iList) <= 1:return iListleft = []right = []for i in iList[1:]:if i <= iList[0]:left.append(i)else:right.append(i)return quickSort(left) + [iList[0]] + quickSort(right)
if __name__ == "__main__":print("排序前随机序列",iList)print("快速排列后:",quickSort(iList))print("运行程序所花的时间",timeit.timeit("quickSort(iList)","from __main__ import quickSort,iList",number=100))
程序代码运行结果:
7.计数排序
- 总结
比较特殊的算法,不是基于比较的算法,将两个数进行比较,将大的数放在 前面,小的数放在后面的算法叫做基于比较的算法; - 原理
首先建立一个与原数列相等的空数列,采用一种巧妙地方法,就是选择一个数作为基数,然后统计有多少个数比基数小,如果整个数列中有n个数比基数小,那么基数就放在新数列的第n+1的位置,rlist[n]; - 举例演示
下面展示一些计数排序算法
。
计数排序算法实现代码
import random
import timeitdef randomList(n):iList = []for i in range(n):iList.append(random.randrange(1000))return iList
iList=randomList(20)
def countingSort(iList):if len(iList) <=1:return iListiLen=len(iList)rList = [None]*iLenfor i in range(iLen):small = 0 # 比基数小的same = 0 # 与基数相等的for j in range(iLen):if iList[j] < iList[i]:small += 1elif iList[j] == iList[i]:same += 1for k in range(small, small+same):rList[k] = iList[i]return rListif __name__ == "__main__":print("排序前:",iList)print("计数排序后的结果:",countingSort(iList))print("运行程序所花费的时间:",timeit.timeit("countingSort(iList)","from __main__ import countingSort,iList", number=100))
程序代码运行结果展示
本人水平有限,代码可能有很多需要改进,欢迎大家评论讨论问题!
python排序算法大全(附源代码)相关推荐
- python排序算法——归并排序(附代码)
python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...
- python排序算法 ——冒泡排序(附代码)
python排序算法 --冒泡排序 文章目录 python排序算法 --冒泡排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...
- python排序算法——希尔排序(附代码)
python排序算法--希尔排序 文章目录 python排序算法--希尔排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法 ...
- JavaScript实现ShellSort希尔排序算法(附完整源码)
JavaScript实现ShellSort希尔排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 ShellSort.js完整源代码 Comparator.js完整 ...
- JavaScript实现SelectionSort选择排序算法(附完整源码)
JavaScript实现SelectionSort选择排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 SelectionSort.js完整源代码 Compara ...
- JavaScript实现CountingSort计数排序算法(附完整源码)
JavaScript实现CountingSort计数排序算法(附完整源码) Comparator.js完整源代码 Sort.js完整源代码 CountingSort.js完整源代码 Comparato ...
- JavaScript实现topologicalSort拓扑排序算法(附完整源码)
JavaScript实现topologicalSort拓扑排序算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 LinkedList.js完整源代 ...
- python常用代码入门-入门十大Python机器学习算法(附代码)
入门十大Python机器学习算法(附代码) 今天,给大家推荐最常用的10种机器学习算法,它们几乎可以用在所有的数据问题上: 1.线性回归 线性回归通常用于根据连续变量估计实际数值(房价.呼叫次数.总销 ...
- Python排序算法总结
Python排序算法总结 递归 在正式讲算法之前,先介绍一下递归.递归是一种解决问题的思路. 特点 调用自身 必须有一个明确的结束条件,比如if... 递归的两个阶段: 递推(压栈):到某个阶段,该阶 ...
最新文章
- 15级团队学习成果汇报 -- 利用C#语言实现展览厅
- pytorch shape[1]的解释
- Java 8 Friday Goodies:新的新I / O API
- mybatis查询返回空,SQL数据库执行有数据!
- python怎么让按钮乱跑_python GUI实现小球满屏乱跑效果
- linux 系统下 tar 的压缩与解压缩命令
- linux wifi问题,Ubuntu下wifi问题解决
- 网上赚钱的方法门路有哪些?盘点网上赚钱最可靠的10种方法!
- 网页截图插件FireShot
- 001 红黑树(二)之 C语言的实现(3)
- 障碍期权定价 python_Python二项期权定价
- 局域网内的ARP断网攻击
- timeGetTime函数用法
- wps word 表格中,每次换行,都会变成另一种字体,无法对其的问题解决。
- 解决Linux上steam更新游戏后导致版本不一致连接失败的问题
- 算法训练 JAM计数法 java 题解
- 段永平回应一切:从未遥控OV,黄峥不是弟子,靠营销不能持久
- 网易数帆深度参编中国信通院《低代码发展白皮书(2022年)》
- TXTReader功能之二:页码问题
- B站直播:通信工程师考试大科普(下周四)