侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python排序算法实例代码

Python  /  管理员 发布于 7年前   414

排序算法,下面算法均是使用Python实现:

插入排序

原理:循环一次就移动一次元素到数组中正确的位置,通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quicksort。时间复杂度为 O(n2) 。

# 1nd: 两两交换def insertion_sort(arr): for i in range(1, len(arr)):  j = i  while j >= 0 and arr[j-1] > arr[j]:   arr[j], arr[j-1] = arr[j-1], arr[j]   j -= 1 return arr# 2nd: 交换,最后处理没交换的def insertion_sort2(arr): for i in range(1, len(arr)):  j = i-1  key = arr[i]  while j >= 0 and arr[j] > key:   arr[j+1] = arr[j]   j -= 1  arr[j+1] = key return arr# 3nd: 加速版本,利用已经排好了序的进行二分查找def insertion_sort3(seq): for i in range(1, len(seq)):  key = seq[i]  # invariant: ``seq[:i]`` is sorted  # find the least `low' such that ``seq[low]`` is not less then `key'.  # Binary search in sorted sequence ``seq[low:up]``:  low, up = 0, i  while up > low:   middle = (low + up) // 2   if seq[middle] < key:    low = middle + 1   else:    up = middle  # insert key at position ``low``  seq[:] = seq[:low] + [key] + seq[low:i] + seq[i + 1:] return seq# 4nd: 原理同上,使用bisectimport bisectdef insertion_sort4(seq): for i in range(1, len(seq)):  bisect.insort(seq, seq.pop(i), 0, i) # 默认插在相同元素的左边 return seq

选择排序

原理:每一趟都选择最小的值和当前下标的值进行交换,适用在大型的数组,时间复杂度为 O(n2)

# 1nd: fordef select_sort(seq): for i in range(0, len(seq)):  mi = i  for j in range(i, len(seq)):   if seq[j] < seq[mi]:    mi = j  seq[mi], seq[i] = seq[i], seq[mi] return seq# 2nd: mindef select_sort2(seq): for i, x in enumerate(seq):  mi = min(range(i, len(seq)), key=seq.__getitem__)  seq[i], seq[mi] = seq[mi], x return seq

冒泡排序

原理:比较数组中两两相邻的数,如果第一个大于第二个,就进行交换,重复地走访过要排序的数列,达到将最小的值移动到最上面的目的,适用于小型数组,时间复杂度为O(n2)

def bubble_sort(seq): for i in range(len(seq)):  for j in range(len(seq)-1-i):   if seq[j] > seq[j+1]:    seq[j], seq[j+1] = seq[j+1], seq[j] return seqdef bubble_sort2(seq): for i in range(0, len(seq)):  for j in range(i + 1, len(seq)):   if seq[i] > seq[j]:    seq[i], seq[j] = seq[j], seq[i] return seq

快速排序

原理:从数组中选择pivot,分成两个数组,一个是比pivot小,一个是比pivot大,最后将这两个数组和pivot进行合并,最好情况下时间复杂度为O(n log n),最差情况下时间复杂度为O(n2)

def quick_sort(seq): if len(seq) >= 1:  pivot_idx = len(seq)//2  small, large = [], []  for i, val in enumerate(seq):   if i != pivot_idx:    if val <= seq[pivot_idx]:     small.append(val)    else:     large.append(val)  quick_sort(small)  quick_sort(large)  return small + [seq[pivot_idx]] + large else:  return seq

归并排序

原理:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

# 1nd: 将两个有序数组合并到一个数组def merge(left, right): i, j = 0, 0 result = [] while i < len(left) and j < len(right):  if left[i] <= right[j]:   result.append(left[i])   i += 1  else:   result.append(right[j])   j += 1 result += left[i:] result += right[j:] return resultdef merge_sort(lists): if len(lists) <= 1:  return lists num = len(lists) / 2 left = merge_sort(lists[:num]) right = merge_sort(lists[num:]) return merge(left, right)# 2nd: use mergefrom heapq import mergedef merge_sort2(m): if len(m) <= 1:  return m middle = len(m) // 2 left = m[:middle] right = m[middle:] left = merge_sort(left) right = merge_sort(right) return list(merge(left, right))

堆排序

原理:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。平均时间复杂度为O(n logn)

# 1nd: normaldef swap(seq, i, j): seq[i], seq[j] = seq[j], seq[i]# 调整堆def heapify(seq, end, i): l = 2 * i + 1 r = 2 * (i + 1) ma = i if l < end and seq[i] < seq[l]:  ma = l if r < end and seq[ma] < seq[r]:  ma = r if ma != i:  swap(seq, i, ma)  heapify(seq, end, ma)def heap_sort(seq): end = len(seq) start = end // 2 - 1 # 创建堆 for i in range(start, -1, -1):  heapify(seq, end, i) for i in range(end - 1, 0, -1):  swap(seq, i, 0)  heapify(seq, i, 0) return seq# 2nd: use heapqimport heapqdef heap_sort2(seq): """ Implementation of heap sort """ heapq.heapify(seq) return [heapq.heappop(seq) for _ in range(len(seq))]

希尔排序

原理:希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

def shell_sort(seq): count = len(seq) step = 2 group = count // step while group > 0: for i in range(0, group): j = i + group while j < count: k = j - group key = seq[j] while k >= 0:  if seq[k] > key:  seq[k + group] = seq[k]  seq[k] = key  k -= group j += group group //= step return seq

区别

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    关于Python中空格字符串处理的技巧总结
    下一条:
    简单谈谈python中的语句和语法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客