排序概述及Python实现

devtools/2024/12/26 12:57:09/

1. 定义与目的

排序是将一组数据按照特定顺序排列的过程,其目的是为了便于数据的查找和处理,提高数据处理效率。

2. 分类

排序可以分为内部排序和外部排序。

2.1 内部排序

内部排序是指所有数据都在内存中进行排序。例如,对一个列表中的整数进行排序。

# 内部排序示例:对列表进行排序
lst = [5, 2, 8, 1, 9]
lst.sort()
print(lst)

2.2 外部排序

外部排序是指数据量过大,部分数据存储在外存中,需要分批调入内存进行排序。比如对一个大型文件中的数据进行排序,无法一次性将所有数据读入内存。

3. 算法好坏衡量标准

衡量算法>排序算法的好坏可以从空间效率、稳定性和时间效率三个方面来评估。

4. 内部排序方法

内部排序是指待排序的数据元素全部存放在计算机内存中的算法>排序算法。常见的内部排序方法有插入排序、交换排序、选择排序、归并排序和基数排序等。

4.1 插入排序

插入排序的基本思想是将待排序的元素插入到已排序的部分序列中,逐步构建有序序列。

直接插入排序
def insertion_sort(lst):for i in range(1, len(lst)):key = lst[i]j = i - 1while j >= 0 and lst[j] > key:lst[j + 1] = lst[j]j -= 1lst[j + 1] = keyreturn lst# 测试直接插入排序
lst = [5, 2, 8, 1, 9]
print(insertion_sort(lst))
折半插入排序
def binary_insertion_sort(lst):for i in range(1, len(lst)):key = lst[i]low, high = 0, i - 1while low <= high:mid = (low + high) // 2if lst[mid] > key:high = mid - 1else:low = mid + 1for j in range(i - 1, high, -1):lst[j + 1] = lst[j]lst[high + 1] = keyreturn lst# 测试折半插入排序
lst = [5, 2, 8, 1, 9]
print(binary_insertion_sort(lst))
希尔排序
def shell_sort(lst):n = len(lst)gap = n // 2while gap > 0:for i in range(gap, n):temp = lst[i]j = iwhile j >= gap and lst[j - gap] > temp:lst[j] = lst[j - gap]j -= gaplst[j] = tempgap //= 2return lst# 测试希尔排序
lst = [5, 2, 8, 1, 9]
print(shell_sort(lst))

4.2 交换排序

交换排序的基本思想是通过不断交换相邻元素的位置,将逆序对调整为顺序对,从而实现排序。

起泡排序
def bubble_sort(lst):n = len(lst)for i in range(n):for j in range(0, n - i - 1):if lst[j] > lst[j + 1]:lst[j], lst[j + 1] = lst[j + 1], lst[j]return lst# 测试起泡排序
lst = [5, 2, 8, 1, 9]
print(bubble_sort(lst))
快速排序
def quick_sort(lst):if len(lst) <= 1:return lstpivot = lst[0]left = []right = []for x in lst[1:]:if x <= pivot:left.append(x)else:right.append(x)return quick_sort(left) + [pivot] + quick_sort(right)# 测试快速排序
lst = [5, 2, 8, 1, 9]
print(quick_sort(lst))

4.3 选择排序

选择排序的基本思想是每一趟在待排序元素中选择最小(或最大)的元素,放到已排序序列的末尾。

简单选择排序
def selection_sort(lst):for i in range(len(lst)):min_idx = ifor j in range(i + 1, len(lst)):if lst[j] < lst[min_idx]:min_idx = jlst[i], lst[min_idx] = lst[min_idx], lst[i]return lst# 测试简单选择排序
lst = [5, 2, 8, 1, 9]
print(selection_sort(lst))
堆排序
def heapify(lst, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and lst[i] < lst[l]:largest = lif r < n and lst[largest] < lst[r]:largest = rif largest != i:lst[i], lst[largest] = lst[largest], lst[i]heapify(lst, n, largest)def heap_sort(lst):n = len(lst)for i in range(n // 2 - 1, -1, -1):heapify(lst, n, i)for i in range(n - 1, 0, -1):lst[i], lst[0] = lst[0], lst[i]heapify(lst, i, 0)return lst# 测试堆排序
lst = [5, 2, 8, 1, 9]
print(heap_sort(lst))

4.4 归并排序

归并排序的定义是将两个或多个已排序的子序列合并成一个有序序列。

2 - 路归并排序过程
def merge_sort(lst):if len(lst) <= 1:return lstmid = len(lst) // 2left_half = merge_sort(lst[:mid])right_half = merge_sort(lst[mid:])return merge(left_half, right_half)def merge(left, right):merged = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:merged.append(left[i])i += 1else:merged.append(right[j])j += 1merged.extend(left[i:])merged.extend(right[j:])return merged# 测试归并排序
lst = [5, 2, 8, 1, 9]
print(merge_sort(lst))

4.5 基数排序

基数排序的基本思想是根据关键字的各位数字来分配和收集元素,不需要关键字之间的比较。

链式基数排序步骤
def radix_sort(lst):max_value = max(lst)exp = 1while max_value // exp > 0:counting_sort(lst, exp)exp *= 10return lstdef counting_sort(lst, exp):n = len(lst)output = [0] * ncount = [0] * 10for i in range(n):index = (lst[i] // exp) % 10count[index] += 1for i in range(1, 10):count[i] += count[i - 1]i = n - 1while i >= 0:index = (lst[i] // exp) % 10output[count[index] - 1] = lst[i]count[index] -= 1i -= 1for i in range(n):lst[i] = output[i]# 测试基数排序
lst = [170, 45, 75, 90, 802, 24, 2, 66]
print(radix_sort(lst))

http://www.ppmy.cn/devtools/145034.html

相关文章

run postinstall error, please remove node_modules before retry!

下载 node_modules 报错&#xff1a;run postinstall error, please remove node_modules before retry! 原因&#xff1a;node 版本出现错误&#xff0c;我的项目之前是在 12 下运行的。解决方法&#xff1a; 先卸载node_modules清除缓存将node版本切换到12重新下载即可

五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)

上一篇文章&#xff1a; 10分钟学会免费搭建个人博客&#xff08;Hugo框架 stack主题&#xff09; 前言 首先&#xff0c;想要实现这个功能的小伙伴需要完成几个前置条件&#xff1a; 有一个GitHub账号安装了git&#xff0c;并可以通过git推送commit到GitHub上完成第一篇文章…

[图] 遍历 | BFS | DFS

目录 1. 基本概念 2. 图的广度优先遍历&#xff08;BFS&#xff09; 3. 图的深度优先遍历&#xff08;DFS&#xff09; 4. 非连通图的遍历 1. 基本概念 给定一个图G和其中任意一个顶点v0&#xff0c;从v0出发&#xff0c;沿着图中各边访问图中的所有顶点&#xff0c;且每个…

使用python的模块cryptography对文件加密

#数据安全加密# 在运维过程中,涉及到有些重要文件需要加密存储,我们可以通过python中的cryptography模块,对重要文件进行加密 首先 引入相关的模块 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends i…

KAFKA消費數據的三種方式

点对点 点对点的消费模式也称为队列模式&#xff0c;它会将详细发送到一个队列中&#xff0c;并由只能有一个消费者来读取信息&#xff0c;即一个消息智慧被一个消费者处理&#xff0c;这种模式下只有一个消费者可以处理消息&#xff0c;如果想要多个消费者处理消息就要启动多…

【期末复习】JavaEE(上)

1. Java EE概述 开发环境及开发工具 1.1. HTTP协议 开发模式 2. Java Web技术 JSP技术 2.1. Servlet技术 2.1.1. HttpServletRequest 常用方法 2.1.2. HttpServletRequest 请求乱码 tomcat7 及以下&#xff08;对于每个参数单独进行编码转换&#xff09;&#xff1a; 2.…

盒子模型(外边距的设置)

用于页面中元素的合理布局所有的元素都可以有宽高所有元素都是一个矩形所有元素都可以看成一个盒子盒子包括 外边距边框内边距元素内容 外边距设置 外边距的要素&#xff1a;top、bottom、left、right外边距的尺寸&#xff1a;合法的尺寸单位外边距语法&#xff1a;marign-方…

Linux-Ubuntu之按键中断实验

Linux-Ubuntu之按键中断实验 一&#xff0c; 汇编对中断进行设置二&#xff0c;C语言模块1.中断配置2.GPIO口配置3.按键配置4.主函数 三&#xff0c;总结 一&#xff0c; 汇编对中断进行设置 列出对中断向量表&#xff0c;主要用的是IRQ中断和复位中断服务函数&#xff0c;复位…