当前位置: 首页 > news >正文

python 八大排序算法

1、选择排序

选择排序是一种简单直观的排序算法,其工作原理是在未排序序列中找到最小(或最大)的元素,存放到排序序列的起始位置,然后继续寻找剩余未排序序列中的最小(或最大)元素,放到已排序序列的末尾,直至所有元素排序完毕。

在Python中,选择排序的实现代码如下:

arr = [4,2,6,5,7,8]
for i in range(0,len(arr)):for j in range(i+1,len(arr)):if arr[i] >= arr[j]:arr[i],arr[j]=arr[j],arr[i]        
print(arr)

2、冒泡排序

冒泡排序是一种基本的交换排序算法,其工作原理是通过相邻元素之间的比较和交换,将最大(或最小)的元素逐渐移动到数组末尾。

在Python中,冒泡排序的实现代码如下:

arr = [4,2,6,5,7,8]
for i in range(0,len(arr)-1):for j in range(0,len(arr)-1-i):if arr[j] >= arr[j+1]:arr[j],arr[j+1]=arr[j+1],arr[j]
print(arr)

3、插入排序

插入排序是一种简单直观的排序算法,其工作原理是把第一个元素看做已排序的圆度,然后将未排序的元素插入到已排序的部分中的合适位置,直到所有元素排好序。

在Python中,插入排序的实现代码如下:

arr = [4,2,6,5,7,8]
for i in range(1,len(arr)):for j in range(i,0,-1):if arr[j] <= arr[j-1]:arr[j],arr[j-1]=arr[j-1],arr[j]        
print(arr)

4、希尔排序

希尔排序(Shell Sort)是插入排序的一种高效改进版本,也称为缩小增量排序。希尔排序是非稳定排序算法,其基本思想是将待排序的序列划分成若干个子序列,每个子序列内部完成插入排序,随后逐步缩小子序列的间隔,直到间隔为1,整个序列就变得有序。

在Python中,希尔排序的实现代码如下:

def shell_sort(arr):n = len(arr)gap = n // 2  # 初始化间隔while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2  # 缩小间隔return arr

5、快速排序

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

在Python中,快速排序的实现代码如下:

# 实现快速排序方法的函数
def quick_sort_num(nums,start,end):if start < end:# 定义基准值为第一个数i, j, pivot = start, end, nums[start]while i < j:# 将基准数右边的数中比基准数小的放到左边while i < j and nums[j] >= pivot:j = j-1if i < j:nums[i] = nums[j]i = i+1# 将基准数左边的数中比基准数大的数放到右边while i < j and nums[i] < pivot:i = i+1if i < j:nums[j] = nums[i]j = j-1nums[i] = pivot# 分别将基准数左边的数列和右边的数列进行递归quick_sort_num(nums, start, i-1)quick_sort_num(nums, i+1, end)return nums# 快速排序主体函数
def quick_sort(nums):start = 0end = len(nums)-1nums = quick_sort_num(nums, start, end)return nums

6、归并排序

归并排序其实是将原数列分为很多个小数列将其排序,在小数列排序完之后,再将各个小数列进行排序,最后得到一个全部有序的数列。

在Python中,归并排序的实现代码如下:

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = arr[:mid]right = arr[mid:]merge(left, right)

7、基数排序

基数排序的基本思想是先将数字按照个位数上数字的大小进行排序,排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次类推。

在Python中,基数排序的实现代码如下:

def counting_sort(arr, exp):n = len(arr)output = [0] * ncount = [0] * 10for i in range(n):index = arr[i] // expcount[index % 10] += 1for i in range(1, 10):count[i] += count[i - 1]i = n - 1while i >= 0:index = arr[i] // expoutput[count[index % 10] - 1] = arr[i]count[index % 10] -= 1i -= 1for i in range(n):arr[i] = output[i]def radix_sort(arr):max_element = max(arr)exp = 1while max_element // exp > 0:counting_sort(arr, exp)exp *= 10

8、堆排序

堆排序是一种特殊的比较排序算法,其基本思想是维护一个最大值(或最小值)的堆,每次将堆顶元素与堆底元素交换,然后重新调整堆结构,直到堆为空。

在Python中,堆排序的实现代码如下:

def heapify(arr, n, i):largest = i  # 假设当前元素为最大值left = 2 * i + 1right = 2 * i + 2if left < n and arr[left] > arr[largest]:largest = leftif right < n and arr[right] > arr[largest]:largest = rightif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)

相关文章:

  • 使用CSS3画出一个叮当猫HTML源码
  • UE5 GameMode C++函数 学习
  • C++ 侯捷 程序设计(Ⅱ)兼谈对象模型 笔记
  • docker镜像复制与常见命令
  • 【图解物联网】第2章 物联网的架构
  • 【蓝桥杯嵌入式】四、各种外设驱动(十一)ADC(1):软件触发与中断触发方式
  • ubuntu生成 设置 core文件
  • 基于OpenCV的图像处理案例之图像矫正(Python)
  • 每日OJ题_牛客_QQ2 微信红包
  • 33.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-游戏登录数据包分析利用
  • python的OA公文发文管理系统flask-django-php-nodejs
  • 【Node.js从基础到高级运用】十五、单元测试与集成测试
  • SQL:窗口函数之OVER()
  • Redis 的BGSAVE和BGREWRITEAOF操作
  • Vue模块化开发步骤—遇到的问题—解决办法
  • Druid 在有赞的实践
  • git 常用命令
  • IndexedDB
  • java中具有继承关系的类及其对象初始化顺序
  • JS变量作用域
  • Spark RDD学习: aggregate函数
  • Spring Boot快速入门(一):Hello Spring Boot
  • Zepto.js源码学习之二
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 回流、重绘及其优化
  • 计算机常识 - 收藏集 - 掘金
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端面试总结(at, md)
  • 思否第一天
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​插件化DPI在商用WIFI中的价值
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)JAVA使用POI操作excel
  • (二十四)Flask之flask-session组件
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET delegate 委托 、 Event 事件
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET中GET与SET的用法
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @Data注解的作用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @property @synthesize @dynamic 及相关属性作用探究
  • [20180129]bash显示path环境变量.txt
  • [20180224]expdp query 写法问题.txt
  • [AHOI2009]中国象棋 DP,递推,组合数