python实现经典排序算法的示例代码


Posted in Python onFebruary 07, 2021

以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想。

冒泡排序

内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序。

def bubble_sort(arr):
  length = len(arr)
  for i in range(length):
    for j in range(length - i - 1):
      if arr[j] > arr[j + 1]:
        arr[j], arr[j + 1] = arr[j + 1], arr[j]
  return arr

选择排序

每次内层循环都会得到一个当前最小的元素,并将其放到合适的位置。内层循环第一次结束后会将最小的元素交换到序列首位,第二次结束后会将第二小的元素交换到序列第二位,每次内层循环结束后都会将一个元素放在正确的顺序位置。

def selection_sort(arr):
  length = len(arr)
  for i in range(length):
    min_index = i
    for j in range(i + 1, length):
      if arr[j] < arr[min_index]:
        min_index = j
    arr[i], arr[min_index] = arr[min_index], arr[i]
  return arr

插入排序

类比玩扑克牌时理牌的思想,从第一个元素开始,假设它是已经排好序的。然后开始处理第二个元素,如果比第一个元素小,则将其放到第一个元素左边,否则放在其右边,那么现在前两个元素以及排好序了,之后再依次处理剩余的元素。

def insertion_sort(arr):
  length = len(arr)
  for i in range(1, length):
    pre = i - 1
    current_value = arr[i]
    while pre >= 0 and arr[pre] > current_value:
      arr[pre + 1] = arr[pre]
      pre -= 1
    arr[pre+1] = current_value
  return arr

希尔排序

希尔排序就是将插入排序的改进版本。插入排序中每次逐步比较元素,而希尔排序中则是从一个较大的步数开始比较,最后减小到一步。

def shell_sort(arr):
  length = len(arr)
  gap = length // 2
  while gap > 0:
    for i in range(gap, length):
      pre = i - gap
      current_value = arr[i]
      while pre >= 0 and arr[pre] > current_value:
        arr[pre + gap] = arr[pre]
        pre -= gap
      arr[pre + gap] = current_value
    gap = gap // 2
  return arr

归并排序

先将序列前半部分排好序,再将序列后半部分排好序,之后再将这两部分合并得到最终的序列,具体实现为递归地将序列分为两部分,分别排序后再合并。

def merge(left, right):
  result = []
  while len(left) > 0 and len(right) > 0:
    if left[0] < right[0]:
      result.append(left.pop(0))
    else:
      result.append(right.pop(0))
  if len(left) > 0:
    result.extend(left[:])
  if len(right) > 0:
    result.extend(right[:])
  return result


def merge_sort(arr):
  if len(arr) < 2:
    return arr
  middle = len(arr) // 2
  return merge(merge_sort(arr[:middle]), merge_sort(arr[middle:]))

快速排序

取一个元素,将比它小的元素都移到它左侧,将比它大的元素都移到它右侧,并递归地处理它左侧的序列和右侧的序列。

def partition(arr, left=None, right=None):
  pivot = left
  index = pivot + 1
  for i in range(index, right + 1):
    if arr[i] < arr[pivot]:
      arr[i], arr[index] = arr[index], arr[i]
      index += 1
  arr[pivot], arr[index - 1] = arr[index - 1], arr[pivot]
  return index - 1


def quick_sort(arr, left=None, right=None):
  left = 0 if left is None else left
  right = len(arr) - 1 if right is None else right
  if left < right:
    partition_index = partition(arr, left, right)
    quick_sort(arr, left, partition_index - 1)
    quick_sort(arr, partition_index + 1, right)
  return arr

堆排序

首先构建一个最大堆,最大堆的性质是父节点的值总是大于其左右子节点的值,那么此时根节点的值是最大的,则将其移到序列的最右边。之后将堆中当前最后一个叶节点移到根节点上,因为这可能会不符合最大堆的性质,所以会进行调整,将它与其左右子节点中最大的值进行交换,则相当于将叶节点向下移动,交换过后如果还是不符合性质,则继续进行交换,直到符合性质后,此时的根节点的值就是当前堆中的最大值,将其取出放入序列中正确的位置后继续上述流程处理剩下的节点。

global length2


def heapify(arr, i):
  left = 2 * i + 1
  right = 2 * i + 2
  largest = i
  if left < length2 and arr[left] > arr[largest]:
    largest = left
  if right < length2 and arr[right] > arr[largest]:
    largest = right
  if largest != i:
    arr[i], arr[largest] = arr[largest], arr[i]
    heapify(arr, largest)


def build_max_heap(arr):
  for i in range(len(arr) // 2, -1, -1):
    heapify(arr, i)


def heap_sort(arr):
  global length2
  length2 = len(arr)
  build_max_heap(arr)
  for i in range(len(arr) - 1, 0, -1):
    arr[0], arr[i] = arr[i], arr[0]
    length2 -= 1
    heapify(arr, 0)
  return arr

计数排序

将序列中的元素按照其值放入相应的桶中,之后再按照桶的顺序取出即可,计数排序不需要比较操作。

def counting_sort(arr):
  max_value = max(arr)
  buckets = [0] * (max_value + 1)
  index = 0
  length = len(arr)
  for i in range(length):
    buckets[arr[i]] += 1
  for j in range(max_value + 1):
    while buckets[j] > 0:
      arr[index] = j
      index += 1
      buckets[j] -= 1
  return arr

桶排序

类别计数排序,构造很多桶,但每个桶中能放入值在特定范围内的元素,将序列中的元素按照要求放入各个桶中,再将每个桶中的元素进行排序,最后按照桶的顺序和各个桶中元素的顺序得到最终序列。

def bucket_sort(arr):
  bucket_size = 5
  max_value = max(arr)
  min_value = min(arr)
  bucket_num = (max_value - min_value) // bucket_size + 1
  buckets = {i: [] for i in range(bucket_num)}
  for i in range(len(arr)):
    buckets[(arr[i] - min_value) // bucket_size].append(arr[i])
  result = []
  for i in range(bucket_num):
    insertion_sort(buckets[i])
    result.extend(buckets[i])
  return result

基数排序

按照元素值的特定位进行排序,从低位到高位分别进行排序。

def radix_sort(arr):
  max_value = max(arr)
  max_digit = len(str(max_value))
  dev = 1
  mod = 10
  result = arr[:]
  for i in range(max_digit):
    buckets = {i: [] for i in range(mod)}
    for k in range(len(result)):
      key = (result[k] % mod) // dev
      buckets[key].append(result[k])
    result = []
    for j in range(mod):
      result.extend(buckets[j])
    dev *= 10
    mod *= 10
  return result

上述代码放在 这里

参考

  • https://www.cnblogs.com/onepixel/p/7674659.html
  • 算法导论
  • 菜鸟教程

到此这篇关于python实现经典排序算法的示例代码的文章就介绍到这了,更多相关python 经典排序算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
python正向最大匹配分词和逆向最大匹配分词的实例
Nov 14 Python
python感知机实现代码
Jan 18 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
Jun 28 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
python os模块在系统管理中的应用
Jun 22 Python
Python基于traceback模块获取异常信息
Jul 23 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 Python
pytorch 一行代码查看网络参数总量的实现
May 12 Python
Python自动化测试基础必备知识点总结
Feb 07 #Python
10张动图学会python循环与递归问题
Feb 06 #Python
PyCharm 光标变成黑块的解决方式
Feb 06 #Python
使用Python下载抖音各大V视频的思路详解
Feb 06 #Python
python wsgiref源码解析
Feb 06 #Python
Python 中的函数装饰器和闭包详解
Feb 06 #Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 #Python
You might like
由php的call_user_func传reference引发的思考
2010/07/23 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
2020/07/15 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
Windows下安装python2和python3多版本教程
2017/03/30 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
工商管理系学生的自我评价分享
2013/11/29 职场文书
学生打架检讨书
2014/02/14 职场文书
服务标兵事迹材料
2014/05/04 职场文书
业务员岗位职责范本
2015/04/03 职场文书
python实现高效的遗传算法
2021/04/07 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
JavaScript实现简单拖拽效果
2021/09/15 Javascript
Python 正则模块详情
2021/11/02 Python
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技