十种排序算法的python实现

排序

1. 冒泡排序(Bubble Sort)

基本原理
冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

应用场景
适用于数据量较小且基本有序的数列排序。

优点

  • 实现简单。
  • 对基本有序的数列排序效率较高。

缺点

  • 时间复杂度较高,最坏情况下是O(n^2)。
  • 对于大数据集效率低下。

Python实现

def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
print("原始数组:", arr)
bubble_sort(arr)
print("排序后数组:", arr)

2. 选择排序(Selection Sort)

基本原理
选择排序是一种简单直观的排序算法。它的工作原理是,首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

应用场景
适用于数据量较小的情况,或用于解决特定问题,如查找第k小的元素。

优点

  • 实现简单。
  • 交换次数少,数据移动少。

缺点

  • 时间复杂度较高,为O(n^2)。
  • 对于大数据集排序效率低下。

Python实现

def selection_sort(arr):for i in range(len(arr)):min_index = ifor j in range(i+1, len(arr)):if arr[j] < arr[min_index]:min_index = jarr[i], arr[min_index] = arr[min_index], arr[i]return arr# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
print("原始数组:", arr)
selection_sort(arr)
print("排序后数组:", arr)

3. 插入排序(Insertion Sort)

基本原理
插入排序的工作方式是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

应用场景
适用于数据量较小,且数据基本有序的情况。也常用于将数据插入到已排序的数组中。

优点

  • 实现简单。
  • 对基本有序的数据排序效率高。
  • 稳定排序。

缺点

  • 对于大数据集或无序数据集效率较低,时间复杂度最坏为O(n^2)。
  • 需要移动大量元素。

Python实现

def insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:arr[j + 1] = arr[j]j -= 1arr[j + 1] = keyreturn arr# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
print("原始数组:", arr)
insertion_sort(arr)
print("排序后数组:", arr)

4. 归并排序(Merge Sort)

基本原理
归并排序是一种分治策略的排序算法。它将一个大数组分割成两个小数组,分别对这两个小数组进行排序,然后将这两个已排序的小数组合并成一个大的有序数组。

应用场景
归并排序适用于对大量数据进行排序,尤其是外部排序(即数据太大,无法全部加载到内存中)。在数据库管理系统和文件系统中常用。

优点

  • 稳定排序算法。
  • 时间复杂度为O(n log n),效率较高。

缺点

  • 需要额外的空间来存储中间结果。

Python实现

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):merged = []left_index, right_index = 0, 0while left_index < len(left) and right_index < len(right):if left[left_index] <= right[right_index]:merged.append(left[left_index])left_index += 1else:merged.append(right[right_index])right_index += 1merged.extend(left[left_index:])merged.extend(right[right_index:])return merged# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
print("原始数组:", arr)
r = merge_sort(arr)
print("排序后数组:", r)

5. 快速排序(Quick Sort)

基本原理
快速排序也是一种分治策略的排序算法。它通过选取一个“基准值”(pivot),将数组分为两个子数组,一个包含比基准值小的元素,另一个包含比基准值大的元素,然后递归地对这两个子数组进行快速排序。

应用场景
快速排序在内存中对大数据集进行排序时非常高效,是许多编程语言和库中的默认排序算法。

优点

  • 平均时间复杂度为O(n log n),且常数因子较小。
  • 内部循环可以在大多数实际系统上高效实现。

缺点

  • 在最坏情况下,时间复杂度会退化为O(n^2)。
  • 不是稳定排序算法。

Python实现

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)# 示例
arr = [5, 3, 7, 6, 2, 9, 1, 4, 8]
sorted_arr = quick_sort(arr)
print(sorted_arr)

6. 堆排序(Heap Sort)

基本原理
堆排序利用二叉堆(通常是大根堆)的性质来进行排序。首先构建一个最大堆,然后将堆顶元素(最大值)与最后一个元素交换,之后重新调整堆结构,使其仍然保持最大堆的性质。重复此过程,直到堆的大小变为1。

应用场景
堆排序适用于需要快速找到一系列数中的最大(或最小)值,并对其进行排序的场景。它也被用于实现优先级队列。

优点

  • 时间复杂度为O(n log n),且最坏情况与平均情况相同。
  • 可以在不完全有序的数据集上高效工作。

缺点

  • 不是稳定排序算法。
  • 由于元素交换的不确定性,缓存不命中的可能性较高。

Python实现

def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[i] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)for i in range(n, -1, -1):heapify(arr, n, i)for i in range(n-1, 0, -1):arr[i], arr[0] = arr[0], arr[i]heapify(arr, i, 0)return arr# 示例
arr = [5, 3, 7, 6, 2, 9, 1, 4, 8]
sorted_arr = heap_sort(arr)
print(sorted_arr)

7. 希尔排序(Shell Sort)

基本原理
希尔排序是插入排序的一种优化版本。它首先将待排序的数组元素按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减少到1时,整个数组被分为一组,算法便终止。

应用场景
适用于中等大小的数据集排序,特别是当数据部分有序时表现较好。

优点

  • 相对于直接插入排序,希尔排序通过分组减少了比较和移动的次数,提高了效率。

缺点

  • 算法性能受增量序列的选择影响较大。
  • 不是稳定排序算法,即可能改变相等元素的相对顺序。

Python实现

def shell_sort(arr):n = len(arr)gap = n // 2while 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 //= 2return arr# 示例
arr = [9, 8, 3, 7, 5, 6, 4, 1]
print(shell_sort(arr))  # 输出: [1, 3, 4, 5, 6, 7, 8, 9]

8. 计数排序(Counting Sort)

基本原理
计数排序是一种非比较的排序算法,适用于一个特定范围内的整数排序。它使用一个额外的数组来统计每个整数出现的次数,然后根据计数的结果将输入的数组排序。

应用场景
适用于一定范围内的整数排序,特别是当数据范围较小且数据量大时效率很高。

优点

  • 时间复杂度为O(n+k),其中k是整数的范围,当k不是很大时,算法效率很高。
  • 是一种稳定排序算法。

缺点

  • 当整数的范围k很大时,需要较大的额外空间,造成空间浪费。
  • 只能用于整数排序。

Python实现

def counting_sort(arr):max_val = max(arr)count = [0] * (max_val + 1)for num in arr:count[num] += 1output = []for i in range(len(count)):output.extend([i] * count[i])return output# 示例
arr = [4, 2, 2, 8, 3, 3, 1]
print(counting_sort(arr))  # 输出: [1, 2, 2, 3, 3, 4, 8]

9. 桶排序(Bucket Sort)

基本原理
桶排序是将数组分到有限数量的桶中,每个桶再分别排序(通常使用其他排序算法或是以递归方式继续使用桶排序进行排序)。最后,将各个桶中的数据合并起来。

应用场景
适用于数据均匀分布在一个范围较大的区间内,且数据量较大的情况。

优点

  • 当数据量很大且分布均匀时,桶排序的效率很高,时间复杂度可以接近O(n)。
  • 可以并行处理多个桶,进一步提高效率。

缺点

  • 当数据分布不均匀时,可能会导致某些桶的数据过多,从而降低效率。
  • 需要额外的空间来存储桶。
  • 不是稳定排序算法。

Python实现

def bucket_sort(arr):max_val = max(arr)bucket_range = 10  # 假设每个桶的范围是10,这个值可以根据实际情况调整num_buckets = (max_val // bucket_range) + 1buckets = [[] for _ in range(num_buckets)]for num in arr:index = num // bucket_rangebuckets[index].append(num)sorted_arr = []for bucket in buckets:# 这里为了简单起见,使用了内置的sorted函数,实际应用中可以替换为其他排序算法sorted_arr.extend(sorted(bucket))return sorted_arr# 示例
arr = [9, 2, 0, 17, 4, 31, 13, 8, 6]
print(bucket_sort(arr))  # 输出一个排序后的数组

10.基数排序(Radix Sort)

基本原理
基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数进行排序。通常,基数排序会从最低位开始,对每一位进行排序,然后再按更高位排序,直到最高位。对于每一位,可以使用稳定的排序算法(如计数排序或桶排序)来确保相同位数的数字按原始顺序排列,从而保证整体排序的稳定性。

应用场景
基数排序特别适用于对大量整数进行排序,尤其是当这些整数的位数相对固定且不太长时。例如,在处理大量的手机号、身份证号或其他具有固定格式的数字序列时,基数排序能表现出很高的效率。

优点

  • 稳定性好:基数排序是稳定的排序算法,即相同值的元素在排序后保持其原有的顺序。
  • 效率较高:对于大量整数排序,尤其是位数不多的情况,基数排序的性能通常优于比较型排序算法。

缺点

  • 局限性大:基数排序主要用于整数排序,对于非整数类型的数据,如字符串或对象,需要额外的转换步骤。
  • 空间消耗:基数排序需要额外的空间来存储临时排序结果,这可能会增加内存消耗。

Python实现

def radix_sort(arr):# 找到最大数的位数max_val = max(arr)max_digit = len(str(max_val))# 从最低位到最高位依次排序for k in range(max_digit):# 使用计数排序作为子排序算法bucket = [[] for _ in range(10)]for i in arr:# 获取当前位的数字digit = (i // (10**k)) % 10bucket[digit].append(i)# 重新组合数组arr = [j for i in bucket for j in i]return arr# 示例
arr = [121, 432, 564, 23, 1, 45, 788]
print("原始数组:", arr)
sorted_arr = radix_sort(arr)
print("排序后数组:", sorted_arr)

在这个Python示例中,我们实现了基数排序算法,使用了计数排序作为子排序过程。算法首先确定最大数的位数,然后从最低位开始,对每一位进行排序。这个过程会重复进行,直到处理完最高位。注意,这里的实现是基于整数的排序,并且假设了所有数都是非负的。如果需要处理负数或浮点数,算法将需要额外的处理步骤。

注意:在实际应用中,为了提高效率,通常会对这些基本算法进行一些优化和改进。上面的Python实现主要是为了展示算法的基本原理,可能不是最优的实现方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术周总结2024.06.03~06.09(K8S HikariCP数据库连接池)

文章目录 一、06.05 周三1.1) 问题01: 容器领域&#xff0c;Docker与 K8S的区别和联系Docker主要功能和特点&#xff1a;使用场景&#xff1a; Kubernetes (K8S)主要功能和特点&#xff1a;使用场景&#xff1a; 联系和区别联系&#xff1a;区别&#xff1a; 结合使用总结 二、…

【ARM Cache 系列文章 1.2 -- Data Cache 和 Unified Cache 的详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Data Cache and Unified Cache数据缓存 (Data Cache)统一缓存 (Unified Cache)数据缓存与统一缓存的比较小结 Data Cache and Unified Cache 在 ARM架构中&#xff0c;缓存&#xff08…

Attention注意力机制:理论基础、核心架构、应用领域及最新研究动态

Attention机制源于对序列建模中长期依赖关系的有效捕获需求&#xff0c;其理论基础在于让模型动态分配权重以聚焦于输入序列中与当前任务相关的关键部分。核心架构包括Query-Key-Value三元组计算、Softmax归一化的注意力得分、加权求和生成上下文向量&#xff0c;以及扩展至多头…

vue2学习(06)----vuex

目录 一、vuex概述 1.定义 优势&#xff1a; 2.构建环境步骤 3.state状态 4.使用数据 4.1通过store直接访问 4.2通过辅助函数 5.mutations修改数据&#xff08;同步操作&#xff09; 5.1定义 5.2步骤 5.2.1定义mutations对象&#xff0c;对象中存放修改state数据的方…

每日一题——Python实现PAT乙级1037 在霍格沃茨找零钱(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析&#xff1a; 空间复杂度分析&#xff1a; 我要更强 哲学…

立创·天空星开发板-GD32F407VE-USART

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-USART 基础通信概念同步通信 & 异步通信串行通信 & 并行通信双工 & 单工通讯速率码元 串口通信数据帧 串口封装 基础通信概念 通信协议是网络…

Python编程学习第一篇——Python零基础快速入门(五)—变量

在上一节中讲的元组和元组操作中&#xff0c;经常看到 tup (1, 2, 3) 这样的代码&#xff0c;这里面其实涉及了编程语言中一个重要的概念就是变量&#xff0c;前面的等式中tup是变量&#xff0c;(1, 2, 3) 是赋与变量的值。前面的一些文章的代码中也都有用到变量&#xff0c;下…

STM32F103实现双击、长按、短按后续

经过上次(上一篇文章)的bug&#xff0c;这次进行了修改&#xff0c;基本原理就是使用基本定时器的计数功能&#xff0c;根据计算赋值合适的arr&#xff08;预装载值&#xff09;以及psc&#xff08;预装载系数&#xff09;&#xff0c;使其实现100ms计时一次&#xff0c;在封装…

校园生活服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;跑腿管理&#xff0c;文娱活动管理&#xff0c;活动申请管理&#xff0c;备忘录管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff…

正确挑选百兆超薄款工业级网络/脉冲变压器(网络隔离滤波器)

Hqst华强盛&#xff08;石门盈盛电子&#xff09;导读&#xff1a;工业级百兆超薄款网络变压器的生产要特殊的超薄磁芯配正确线径的铜线&#xff0c;使用符合相应防潮标准的凝固胶水。 一 ̖ 首先来看下商业级的超薄款的百兆网络变压器&#xff1a; 商业级&#xff08;消费级&…

麒麟操作系统运维工程师(KYCP)课程,实现职业突破

在IT行业中&#xff0c;掌握先进的技能和知识是实现职业突破的关键。如果你希望在麒麟操作系统上成为一名卓越的运维工程师&#xff0c;那么麒麟操作系统运维工程师&#xff08;KYCP&#xff09;课程将是你的理想全面提升学员在麒麟操作系统环境下的运维能力。课程内容涵盖安全…

mac读不出来ntfs mac硬盘读不出来盘

新买的Mac电脑由于需要导入旧电脑的数据&#xff0c;因此通常会读取备份硬盘&#xff0c;通过硬盘进行导入。不过由于各种原因&#xff0c;有些mac用户反馈无法正常读取或写入NTFS移动硬盘&#xff0c;下面就通过本篇教程&#xff0c;简单讲述当mac读不出来ntfs&#xff0c;mac…

开关电源中电感设计

开关电源设计中电感 只有充分理解电感在DC/DC电路中发挥的作用,才能更优的设计DC/DC电路。本文还包括对同步DC/DC及异步DC/DC概念的解释。 在开关电源的设计中电感的设计为工程师带来的许多的挑战。工程师不仅要选择电感值,还要考虑电感可承受的电流,绕线电阻,机械尺寸等…

监控易监测对象及指标之:全面监控华为FusionInsight实例

在大数据时代&#xff0c;华为FusionInsight作为一款高性能的大数据处理平台&#xff0c;承载着企业关键业务数据的处理和分析任务。为了确保FusionInsight实例的稳定运行&#xff0c;对其进行全面监控显得尤为重要。本文基于监控易工具&#xff0c;对华为FusionInsight实例的监…

产气荚膜梭菌定植与婴儿食物过敏之间的关联

谷禾健康 牛奶蛋白过敏&#xff08;CMPA&#xff09;是婴儿最常见的食物过敏类型之一。粪便病原菌培养显示产气荚膜梭菌阳性率超过30%&#xff0c;明显高于其他细菌。因此推测产气荚膜梭菌定植可能是婴儿牛奶蛋白过敏的发病因素之一。 一项真实世界的研究&#xff0c;杨敏团队从…

Linux操作系统:MongoDB在虚拟机环境下的安装及部署

上传 MongoDB 安装包 将从官网下载好的 MongoDB 上传到要安装的服务器目录中&#xff0c;建议目录为&#xff1a;/usr/local/ 解压 MongoDB 安装包 cd /usr/local/ tar -zxvf mongodb-linux-x86_64-4.0.0.tgz mv mongodb-linux-x86_64-4.0.0 mongodb 创建 MongoDB 必要目录 …

高通CSIPHY combo mode介绍

目录 使用MIPI Switch 使用高通平台CSIPHY的Combo Mode YYYY使用Combo Mode电路图如下: 如何设置combo PHY mode CSIInfo configuration when camera works in normal mode 平台SoC一般都有多个CSIPHY以满足当前手机相机设计多摄的情况,但是一款SoC CSIPHY的个数也是一定…

【python】错误SyntaxError: invalid syntax的解决方法总结

解决Python报错&#xff1a;【Python】错误SyntaxError: invalid syntax的解决方法总结 SyntaxError是Python编程中常见的错误之一&#xff0c;它表明代码中有语法错误。这种错误可能由多种原因引起&#xff0c;包括但不限于拼写错误、错误的缩进、缺少括号等。本文将介绍几种常…

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 目录 Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 一、简单介绍 二、scikit-learn 基础 1、安装 scikit-learn 2、导入 scikit-learn 3、数据准备 4、数据分割 5、训练模…

使用Gitblit软件开启git服务器

文章目录 使用Gitblit软件开启git服务器&#xff0c;供局域网其他电脑当做git仓库服务1. java依赖环境安装2. Mac系统操作2.1 下载Gitblit、配置参数2.2 启动服务2.3 终止服务&#xff1a;停止脚本即可 3. window系统操作3.1 下载Gitblit、配置参数3.2 启动服务3.3 终止服务&am…