Python实战开发及案例分析(7)—— 排序算法

news/2024/9/22 15:06:13/

        算法>排序算法是计算机科学中的基础,用于将数据元素按照特定的顺序排列。Python 提供了多种方式来实现算法>排序算法,包括内置的排序函数和手动实现各种经典算法>排序算法

Python 内置排序函数

Python 的内置函数 sorted() 和列表的 sort() 方法提供了高效的排序功能。这两种方法默认使用 Timsort 算法,这是一种结合了归并排序和插入排序的高效算法>排序算法

sorted() 函数

  sorted() 函数可以接受任何可迭代对象,并返回一个新的排好序的列表。

示例:排序一组数字和字符串

python"># 数字排序
numbers = [5, 2, 9, 1, 5, 6]
sorted_numbers = sorted(numbers)
print("Sorted numbers:", sorted_numbers)# 字符串排序
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words)
print("Sorted words:", sorted_words)
列表的 sort() 方法

        与 sorted() 不同,sort() 方法会就地排序列表,不创建新的列表。

python"># 就地排序
numbers = [5, 2, 9, 1, 5, 6]
numbers.sort()
print("Sorted numbers in-place:", numbers)

手动实现算法>排序算法

        对于教学和理解算法>排序算法的基本原理,手动实现经典算法>排序算法是非常有用的。

插入排序

        插入排序是一种简单直观的比较算法>排序算法,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

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 = [12, 11, 13, 5, 6]
insertion_sort(arr)
print("Array sorted using insertion sort:", arr)
快速排序

        快速排序是一种高效的算法>排序算法,采用分治法的策略,通过一个分区操作,将原数组分为两个子数组,左边子数组的元素都比右边子数组的元素小,然后递归地排序两个子数组。

python">def quick_sort(arr):if len(arr) <= 1:return arrelse:pivot = 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 = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print("Array sorted using quick sort:", sorted_arr)

结论

        算法>排序算法是数据结构和算法学习的基础,对于优化数据处理和搜索算法非常重要。Python 的内置排序方法提供了高效和简单的解决方案,而手动实现这些算法则有助于深入理解其背后的原理和特点。在实际应用中,选择合适的算法>排序算法可以根据具体需求进行,例如数据大小、数据结构的特性和所需的效率。通过这些示例,我们可以看到不同算法>排序算法在处理相同数据时的效果和性能差异。

        继续探讨更多的算法>排序算法,我们可以深入学习一些其他重要的经典算法>排序算法,如归并排序和堆排序。这些算法在不同的应用场景中表现出了不同的性能优势,特别是在处理大规模数据集时。

归并排序

        归并排序是一种有效的算法>排序算法,采用分治法的策略来实现。它将数组分割成两半,分别排序,然后将它们合并在一起。这种方法在最坏、平均和最佳情况下都提供 𝑂(𝑛log⁡𝑛)O(nlogn) 的时间复杂度。

Python 实现:        

python">def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2  # 找到中间位置left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)  # 对左半部分递归排序merge_sort(right_half)  # 对右半部分递归排序i = j = k = 0# 合并两半while i < len(left_half) and j < len(right_half):if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1# 检查是否有剩余while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1return arr# 示例使用
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Array sorted using merge sort:", sorted_arr)

结论

        归并排序和堆排序提供了不同于简单算法>排序算法(如插入排序或冒泡排序)的性能优势,尤其在处理大规模数据集时表现出更好的稳定性和效率。通过动手实现这些算法,不仅可以加深对其工作原理的理解,还可以提高解决实际排序问题的能力。在实际应用中,选择合适的算法>排序算法可以根据数据的特性和所需的操作效率来决定。

        继续深入探讨更多高级算法>排序算法,我们可以讨论希尔排序和计数排序。这些算法通过不同的策略来优化排序过程,适用于特定类型的数据集。

希尔排序

        希尔排序(也称为递减增量算法>排序算法)是一种基于插入排序的算法。它首先排序间隔较远的元素,然后逐渐减少间隔距离。希尔排序比传统的插入排序更高效,因为它允许元素一次移动较远的距离。

Python 实现:

python">def shell_sort(arr):n = len(arr)gap = n // 2  # 初始间隔while gap > 0:for i in range(gap, n):temp = arr[i]j = i# 进行插入排序,将元素按间隔进行比较while j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2  # 减少间隔return arr# 示例使用
arr = [35, 33, 42, 10, 14, 19, 27, 44]
sorted_arr = shell_sort(arr)
print("Array sorted using shell sort:", sorted_arr)

计数排序

        计数排序是一种非基于比较的算法>排序算法,适用于一定范围内的整数排序。它计算每个元素的出现次数,然后根据元素的计数来放置元素在其正确位置。计数排序是一个线性时间复杂度的算法>排序算法,当输入的元素是 n 个在一定范围内的整数时,它非常高效。

Python 实现:

python">def counting_sort(arr, max_val):n = len(arr)count = [0] * (max_val + 1)  # 计数数组output = [0] * n  # 输出数组# 存储每个元素的计数for num in arr:count[num] += 1# 计数数组变形,后面的元素等于前面的元素之和for i in range(1, max_val + 1):count[i] += count[i - 1]# 反向填充目标数组,保持排序的稳定性for i in range(n - 1, -1, -1):output[count[arr[i]] - 1] = arr[i]count[arr[i]] -= 1return output# 示例使用
arr = [4, 2, 2, 8, 3, 3, 1]
max_val = max(arr)  # 找到最大值
sorted_arr = counting_sort(arr, max_val)
print("Array sorted using counting sort:", sorted_arr)

结论

        希尔排序和计数排序提供了不同的方法来处理排序问题。希尔排序通过分组和逐步细化的插入排序加快排序过程,而计数排序则完全脱离了比较排序的范畴,通过计算元素的出现频率来实现排序。这些算法在适当的场景下使用可以显著提高排序效率,如希尔排序适合中等大小的数组,而计数排序适用于有明确范围的整数数组。在实际选择算法>排序算法时,了解数据的性质和需求是非常关键的,以确保算法的效率和适用性。


http://www.ppmy.cn/news/1453560.html

相关文章

56 关于 linux 的 oom killer 机制

前言 这里主要讲的是 linux 的 oom killer 机制 在系统可用内存较少的情况下&#xff0c;内核为保证系统还能够继续运行下去&#xff0c;会选择杀掉一些进程释放掉一些内存。 通常oom_killer的触发流程是&#xff1a;进程A想要分配物理内存&#xff08;通常是读写内存&#…

ceph osd相关

概述 本文主要介绍ceph osd相关的一些概念。 osd 挂载目录 在osd启动前&#xff0c;需要读一些数据用于引导&#xff0c;校验等等。在使用硬盘创建osd时&#xff0c;经常能看到osd会预留一部分空间&#xff08;ceph-disk版本为盘分区类似/dev/sdb1,ceph-volume版本为temp&am…

设计模式-03 设计模式-工厂模式factory-内部工厂

设计模式-03 设计模式-工厂模式factory-内部工厂 目录 设计模式-03 设计模式-工厂模式factory-内部工厂 1.定义 2.内涵 3.案例对比 4.特点 4.总结 1.定义 内部工厂模式是一种创建类对象的方式&#xff0c;其中工厂方法被封装在类内部&#xff0c;客户端只能通过类的公共…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

EPAI手绘建模APP图层、相机、灯光

④ 图层列表 1) 添加图层。 2) 列表显示场景中所有图层。初始时&#xff0c;默认有一个激活的图层。场景中所有模型都会添加到这个图层。 3) 第一次点击图层名称旁边的可见按钮&#xff0c;图层中所有模型都不可见&#xff0c;再次点击&#xff0c;图层中所有模型可见。 4)…

【MySql】FIND_IN_SET 字符串逗号分隔,判断是否包含某字符串

FIND_IN_SET 字符串逗号分隔&#xff0c;判断是否包含某字符串 一、FIND_IN_SET FIND_IN_SET 返回某字符串在一串有逗号组成的字符串集合(SET)中的第几位&#xff0c;不存在时为0 -- 查询结果&#xff1a;4 SELECT FIND_IN_SET( ad, ac,ab,aa,ad )-- 查询结果&#xff1a;0 …

AcWing算法基础课笔记 ------ 第五章 动态规划

文章目录 一. 线性dp1. 数字三角形2. 最长上升子序列3. 最长公共子序列 二. 区间dp1. 石子合并 三. 计数类dp1. 整数划分 四. 状态压缩dp1. 蒙德里安的梦想2. 最短Hamilton路径 五. 树形dp1. 没有上司的舞会 六. 记忆化搜索1. 滑雪 本篇文章是在Acwing种学习动态规划的笔记题解…

公共交通无障碍设施:科技翅膀助力盲人出行新飞跃

在城市的脉络中&#xff0c;公共交通扮演着连接每一个角落的重要角色。然而&#xff0c;对于视力受限的盲人朋友而言&#xff0c;这幅繁忙而复杂的交通网络往往隐藏着诸多不易察觉的障碍。值得庆幸的是&#xff0c;随着公共交通无障碍设施的不断完善&#xff0c;以及高科技辅助…