一、冒泡排序

核心思想: 通过相邻元素的比较实现排序

def bubble_sort(a, length):'''冒泡排序'''for i in range(length-1):for j in range(0, length-1-i):if a[j] > a[j+1]:a[j], a[j+1] = a[j+1], a[j]
a = [5, 2, 3, 1, 6, 8, 7, 4]
bubble_sort(a, len(a))                

二、选择排序

核心思想:每次选出最小的元素(记录索引)实现排序

def selection_sort(a, length):'''选择排序'''for i in range(length-1):idx = ifor j in range(i+1, length)if a[idx] > a[j]:idx = ja[i], a[idx] = a[idx], a[i]
a = [5, 2, 3, 1, 6, 8, 7, 4]
selection_sort(a, len(a))        

三、快速排序

核心思想: 选择序列中一个数(一般都选择序列的第一个元素),一次循环实现将比这个元素小的元素放到这个元素左边,将比这个元素大的放到元素右边

def quict_sort(a, start_index, end_index):'''快速排序核心函数Args:a = [] 待排序数组start_index = 数组开始索引值end_index = 数组结束索引值Return:a = [] 完成排序数组'''#if条件是递归结束条件if start_index >= end_index:returnboundary_index = quick_boundary(a, start_index, end_index)quict_sort(a, start_index, boundary_index - 1)quict_sort(a, boundary_index + 1, end_index)return adef quick_boundary(a, start_index, end_index):'''快速排序获取拆分边界索引值辅助函数Args:a = [] 待排序数组的拆分start_index = 拆分数组开始索引值end_index = 拆分数组结束索引值Return:boundary_index = Int 边界索引值'''boundary_index = start_indexstandard = a[boundary_index]left_index, right_index = start_index, end_indexwhile left_index < right_index:while left_index < right_index and standard <= a[right_index]:right_index -= 1a[left_index] = a[right_index]while left_index < right_index and standard >= a[left_index]:left_index += 1a[right_index] = a[left_index]a[left_index] = standardboundary_index = left_indexprint(boundary_index)print(a)return boundary_indexa = [49, 38, 65, 97, 76, 13, 27, 49]
quict_sort(a, 0, len(a) - 1)

四、归并排序

核心思想:先递归分解数组,合并数组完成递归排序

def merge_array(a, start_index, mid_index, end_index):'''合并两个有序数组成一个有序数组Args:a = [] 待排序数组start_index = 数组开始索引值mid_index = 数组中间索引值,区分开两个有序数组end_index = 数组结束索引值Return:a = [] 合并的有序数组'''i, j = start_index, mid_index + 1m, n = mid_index, end_indextemp_list = []while i <= m and j <= n:if a[i] <= a[j]:temp_list.append(a[i])i += 1else:temp_list.append(a[j])j += 1while j <= n:temp_list.append(a[j])j += 1while i <= m:temp_list.append(a[i])i += 1for index in range(len(temp_list)):a[start_index + index] = temp_list[index]def merge_sort(a, start_index, end_index):'''归并排序核心函数Args:a = [] 待排序数组start_index = 数组开始索引值end_index = 数组结束索引值Return:a = [] 完成排序数组'''if start_index < end_index:mid_index = (start_index + end_index)/2merge_sort(a, start_index, mid_index)merge_sort(a, mid_index + 1, end_index)merge_array(a, start_index, mid_index, end_index)a = [3, 4, 1, 2, 9, 6, 5, 7, 12, 11, 10]
merge_sort(a, 0, len(a) - 1)

五、堆排序

核心思想:堆排序是在不断自下向上调整堆结构,通过数组索引关联父节点和左右子节点

def adjustheap(a, i, n):'''调整堆'''j = 2*i + 1while j < n:if j+1 < n and a[j] < a[j+1]:j += 1if a[j] < a[i]:breaka[i], a[j] = a[j], a[i]i = jj = 2*i + 1def makeheap(a, n):'''建堆'''for i in range(int(n/2)-1, -1, -1):adjustheap(a, i, n)def heapsort(a, n):'''堆排序'''makeheap(a, n)for i in range(n-1, -1, -1):a[i], a[0] = a[0], a[i]adjustheap(a, 0, i)a = [5, 2, 3, 1, 6, 8, 7, 4]
heapsort(a, len(a))  

供参考!

冒泡、选择、快速、归并、堆排序算法 python实现相关推荐

  1. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  2. 八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数

    八大排序算法 发表于2012/7/23 16:45:18  662397人阅读 分类: c/c++ 数据结构与算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排 ...

  3. 十大排序总结(js实现、稳定性、内外部排序区别、时间空间复杂度、冒泡、快速、直接选择、堆、直接插入、希尔、桶、基数、归并、计数排序)

    目录 排序相关概念 稳定性 内部排序 外部排序 十种排序算法特点总结 交换排序 冒泡排序(数组sort方法的原理) 图解 js实现 特点 快速排序 图解 js实现 特点 选择排序 直接选择排序 图解 ...

  4. 常见经典排序算法学习总结(插入、shell、冒泡、选择、归并、快排等)

    博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了 ...

  5. c#冒泡、快速、选择和插入排序算法的项目应用

    在之前的一篇文章里,我们简单地实现了对一维数组的四种排序算法,但是在实际的项目中,我们排序的方式可能(几乎是一定)不止仅仅按照数字排序.我们常常按照合适的需要的排序方式进行排序,比如航班信息可能按时间 ...

  6. Laravel学习笔记之冒泡、快速、选择和插入排序(持续更新)

    说明:本文是对个人学习冒泡.快速.选择和插入排序的小总结.面试经常问这些东西,虽然不知道为啥老爱问这些,该问的又不问.不管咋样,个人学习MySQL时有关索引就用到快速排序,索引也是以B+Tree数据结 ...

  7. 【算法实践】他山之石, 可以攻玉 -- 利用完全二叉树快速实现堆排序

    前言 什么是堆 堆是一种数据结构,它是完全二叉树或者是近似完全二叉树的一种数据结构,树中每个结点的值都不小于(或不大于)其左右孩子结点的值. 何为完全二叉树 完全二叉树是一种特殊的二叉树,完全二叉树是 ...

  8. 排序算法(五)——堆排序算法详解及Python实现

    本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...

  9. 冒泡、快速、选择、插入排序以及时间复杂度、空间复杂度的解析

    冒泡.快速.选择.插入排序以及时间复杂度.空间复杂度的解析 时间复杂度 时间复杂度的表示方法 时间复杂度的分析和计算方法 常见的几种时间复杂度 常见的时间复杂度排序 空间复杂度 时间复杂度的分析和计算 ...

  10. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

最新文章

  1. grails 转为java_创建一个grails项目,然后转成maven项目
  2. 成年人的低头,从拼多多开始
  3. 初识vue 2.0(5):使用props父子组件通信
  4. 36 MM配置-采购-采购订单-采购订单审批-编辑特性
  5. 【机器学习课程笔记(吴恩达)】1.2 什么是机器学习?
  6. html实现返回上一页的几种方法(javaScript:history.go(-1);)
  7. 判断 Map 中是否包含指定的 key 和 value
  8. c语言调试的意义,C语言的调试
  9. C盘搬家,不需要任何第三方工具
  10. 《第一行代码》ListView控件使用
  11. linux修音软件下载,修音软件下载 Auto Tune 8(修音工具) v8.1.2 免费安装版 下载-脚本之家...
  12. 3dmax:3dmax三维VR渲染设置(V-Ray帧缓存、V-Ray全局开关、V-Ray图像采样器、自适应细分采样器、V-Ray环境、全局确定性蒙特卡、摄像机、颜色贴图)之详细攻略(切记收藏!)
  13. SGD(随机梯度下降算法)的缺点
  14. BSD协议和FreeBSD
  15. mysql got signal 6_[ERROR] mysqld got signal 6 错误
  16. 使用RaiDrive将NAS中的磁盘映射为本地磁盘
  17. 微信公众号登录的一些注意事项
  18. 前端可视化技术-笔记
  19. 与全球外国人即时聊天的网站
  20. 读 RocketMQ 源码,学习并发编程三大神器

热门文章

  1. 1078 最小生成树
  2. Swift开发教程--怎样设置状态栏的文字颜色
  3. OSChina 周一乱弹 ——我后悔让爸妈用微信了!
  4. leetcode 336. Palindrome Pairs
  5. Mac OS 电信3G上网设置
  6. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形...
  7. 分享下我的 netbeans 的配色方案
  8. api 微信小程序组件库colorui_微信小程序入门ColorUI组件库使用方法
  9. PUT 还是 POST ?
  10. php 自定义 base64 解码,php base64 编码与解码实例代码