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

Python常见的排序算法及其特点和实现代码

本文介绍了Python中常见的排序算法及其实现,包括冒泡排序(稳定,O(n²))、选择排序(不稳定,O(n²))、插入排序(稳定,O(n²)最好O(n))、希尔排序(不稳定,O(nlogn))、归并排序(稳定,O(nlogn))、快速排序(不稳定,平均O(nlogn))、堆排序(不稳定,O(nlogn))、计数排序(稳定,O(n+k))、桶排序(稳定,O(n+k))和基数排序(稳定,O(nk))。每种算法都给出了核心原理、时间复杂度和Python实现代码,并指出适用场景,如快速排序适合大数据量,计数排序适合范围固定的整数。

  1. 冒泡排序

    • 原理:重复比较相邻元素,将较大的元素逐渐“冒泡”到数组末尾。
    • 时间复杂度:平均和最坏情况均为O(n2)O(n2),稳定。
    • 代码示例
      def bubblesort(arr):for i in range(1, len(arr)):for j in range(0, len(arr)-i):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr
      
  2. 选择排序

    • 原理:每次从未排序部分选择最小元素,与未排序部分的第一个元素交换。
    • 时间复杂度:O(n2)O(n2),不稳定。
    • 代码示例
      def selectionsort(arr):for i in range(len(arr)-1):minindex = ifor j in range(i+1, len(arr)):if arr[j] < arr[minindex]:minindex = jif i != minindex:arr[i], arr[minindex] = arr[minindex], arr[i]return arr
      
  3. 插入排序

    • 原理:将元素逐个插入到已排序序列的合适位置。
    • 时间复杂度:平均O(n2)O(n2),最好情况O(n)O(n),稳定。
    • 代码示例
      def insertionsort(arr):for i in range(len(arr)):preindex = i-1current = arr[i]while preindex >= 0 and arr[preindex] > current:arr[preindex+1] = arr[preindex]preindex -= 1arr[preindex+1] = currentreturn arr
      
  4. 希尔排序

    • 原理:基于插入排序的改进,通过分组插入减少数据移动次数。
    • 时间复杂度:平均O(nlog⁡n)O(nlogn),不稳定。
    • 代码示例
      def shellsort(arr):import mathgap = 1while gap < len(arr)/3:gap = gap*3 + 1while gap > 0:for i in range(gap, len(arr)):temp = arr[i]j = i - gapwhile j >= 0 and arr[j] > temp:arr[j+gap] = arr[j]j -= gaparr[j+gap] = tempgap = math.floor(gap/3)return arr
      
  5. 归并排序

    • 原理:采用分治法,将数组分成两半,分别排序后再合并。
    • 时间复杂度:O(nlog⁡n)O(nlogn),稳定。
    • 代码示例
      def mergesort(arr):import mathif len(arr) < 2:return arrmiddle = math.floor(len(arr)/2)left, right = arr[0:middle], arr[middle:]return merge(mergesort(left), mergesort(right))def merge(left, right):result = []while left and right:if left[0] <= right[0]:result.append(left.pop(0))else:result.append(right.pop(0))while left:result.append(left.pop(0))while right:result.append(right.pop(0))return result
      
  6. 快速排序

    • 原理:选择一个基准元素,将数组分为小于和大于基准的两部分,递归排序。
    • 时间复杂度:平均O(nlog⁡n)O(nlogn),最坏O(n2)O(n2),不稳定。
    • 代码示例
      def quicksort(arr, left=None, right=None):left = 0 if not isinstance(left, (int, float)) else leftright = len(arr)-1 if not isinstance(right, (int, float)) else rightif left < right:partitionindex = partition(arr, left, right)quicksort(arr, left, partitionindex-1)quicksort(arr, partitionindex+1, right)return arrdef partition(arr, left, right):pivot = leftindex = pivot + 1i = indexwhile i <= right:if arr[i] < arr[pivot]:swap(arr, i, index)index += 1i += 1swap(arr, pivot, index-1)return index-1def swap(arr, i, j):arr[i], arr[j] = arr[j], arr[i]
      
  7. 堆排序

    • 原理:利用堆结构,每次取出堆顶元素构建有序序列。
    • 时间复杂度:O(nlog⁡n)O(nlogn),不稳定。
    • 代码示例
      def heapsort(arr):global arrlenarrlen = len(arr)buildmaxheap(arr)for i in range(len(arr)-1, 0, -1):swap(arr, 0, i)arrlen -= 1heapify(arr, 0)return arrdef buildmaxheap(arr):import mathfor i in range(math.floor(len(arr)/2), -1, -1):heapify(arr, i)def heapify(arr, i):left = 2*i + 1right = 2*i + 2largest = iif left < arrlen and arr[left] > arr[largest]:largest = leftif right < arrlen and arr[right] > arr[largest]:largest = rightif largest != i:swap(arr, i, largest)heapify(arr, largest)
      
  8. 计数排序

    • 原理:统计元素出现次数,按顺序填充到结果数组。
    • 时间复杂度:O(n+k)O(n+k),稳定。
    • 代码示例
      def countingsort(arr, maxvalue):bucketlen = maxvalue + 1bucket = [0] * bucketlensortedindex = 0arrlen = len(arr)for i in range(arrlen):if not bucket[arr[i]]:bucket[arr[i]] = 0bucket[arr[i]] += 1for j in range(bucketlen):while bucket[j] > 0:arr[sortedindex] = jsortedindex += 1bucket[j] -= 1return arr
      
  9. 桶排序

    • 原理:将数据分到不同桶中,对每个桶排序后合并。
    • 时间复杂度:O(n+k)O(n+k),稳定。
    • 代码示例
      def bucket_sort(s):min_num = min(s)max_num = max(s)bucket_range = (max_num - min_num) / len(s)count_list = [[] for _ in range(len(s)+1)]for i in s:count_list[int((i - min_num) // bucket_range)].append(i)s.clear()for i in count_list:for j in sorted(i):s.append(j)
      
  10. 基数排序

    • 原理:按数字位数从低位到高位依次排序。
    • 时间复杂度:O(nk)O(nk),稳定。
    • 代码示例
      def radixsort(list):i = 0n = 1max_num = max(list)while max_num > 10**n:n += 1while i < n:bucket = {}for x in range(10):bucket.setdefault(x, [])for x in list:radix = int((x / (10**i)) % 10)bucket[radix].append(x)j = 0for k in range(10):if len(bucket[k]) != 0:for y in bucket[k]:list[j] = yj += 1i += 1return list
      

以上算法可根据数据特点和需求选择,如快速排序适合大数据量,计数排序适合范围固定的整数。

http://www.dtcms.com/a/403825.html

相关文章:

  • 网站备案号官网深圳全胜专业网站建设
  • ospf 区域内的防环/特殊区域/静默接口/ 认证/前缀列表/ 多进程
  • 鸿蒙NEXT UI Design Kit:打造高端精致界面的新利器
  • 手机网站被自动跳转网易企业邮箱收费版
  • 幽冥大陆(七)安诺克酒店智能门锁SDKV3 VBDemo—东方仙盟
  • 一个主机一个域名做网站商城网站建设运营方案
  • 鸿蒙NEXT应用权限申请全攻略:从配置到授权实战
  • wordpress 文章的形式简述搜索引擎优化的方法
  • 有哪些网站可以做ps挣钱网做网站
  • 个人信息网站建设的心得体会长椿街网站建设
  • MacOS报错“zsh: command not found: brew”【已解决】
  • 网站设计策划书模板wordpress程序上传
  • flash attention利用GPU众核加速注意力计算
  • 晶泰科技与百诚医药签订合作意向书,共同推进AI新药研发合作
  • 漫谈《数字图像处理》之特征提取技术通用分类
  • 如何用php做电商网站wordpress优惠劵
  • [公众号阅读](中国科学院网络中心孙德刚团队)基于语义图学习的恶意域名检测技术
  • 创新的做网站软文写手兼职
  • UE5 小知识点 —— 08 - 摄像机小问题
  • 《UE5_C++多人TPS完整教程》学习笔记59 ——《P60 投射物武器(Projectile Weapons)》
  • 高新快速建设网站电话wordpress玻璃透主题
  • Splunk DB connect 增量查询数据
  • odoo-068 pdf 批量转 img,及 os、 PyMuPDF
  • Leetcode 394. 字符串解码 栈
  • 安康网站建设公司网站建立初步
  • 建设银行网站 购买外汇国美电器如何进行网站的建设与维护
  • MCU的取指周期与等待周期以及指令预取与缓存机制
  • ESP32 IDF 分区表
  • 房地产网站怎么推广贵阳网站建设方案推广
  • 开源 | 充电桩 运维 管理平台(IoT+运维工单平台)功能清单 - 慧知开源充电桩平台