数据结构第八章:排序

一、排序的基本概念(基础必懂)

✅ 排序定义

  • 将一组无序数据按某种规则(如升序/降序)重新排列的过程。

✅ 分类方式

类型 特点
内部排序 所有数据放在内存中进行排序 → 如插入、交换、选择、归并、基数
外部排序 数据太大,不能全部放入内存,需借助磁盘 → 如多路归并排序

✅ 评价标准

指标 含义
时间复杂度 最好、最坏、平均情况下的比较次数
空间复杂度 额外存储空间大小
稳定性 相等元素的相对位置是否改变 → 稳定排序:相同元素顺序不变

💡 稳定性重要性:如学生成绩排序时,同分学生应保持原名次。


二、插入排序(Insertion Sort)

✅ (1)直接插入排序

📌 思想:
  • 将未排序部分逐个插入到已排序部分的合适位置
📌 步骤:
java 复制代码
// 直接插入排序 A[]: 待排序数组 n: 元素个数
void InsertSort(ElemType A[], int n) {
	for(int i = 2; i <= n; i++) { // 依次将A[2]~A[n]插入前面已排序序列
		if(A[i] < A[i - 1]) { // 若A[i]关键码小于其前驱,将A[i]插入有序表
			A[0] = A[i]; // 复制为哨兵,A[0]不存放元素
			for(int j = i - 1; A[0] < A[j]; j--) { // 从后往前查找待插入位置
				A[j + 1] = A[j]; // 向后挪位
			}
			A[j + 1] = A[0]; // 复制到插入位置
		}
	}
}
📌 时间复杂度:
  • 最好: (已有序)
  • 最坏: (逆序)
  • 平均:
📌 空间复杂度:
✅ 特点:
  • 稳定
  • 适合小规模或基本有序的数据

✅ (2)折半插入排序

📌 改进点:
  • 使用折半查找确定插入位置,减少比较次数
📌 步骤:
cpp 复制代码
// 折半插入排序 A[]: 待排序数组 n: 元素个数
void InsertSort(ElemType A[], int n) {
	for(int i = 2; i <= n; i++) { //依次将A[2]~A[n]插入前面的已排序序列
		A[0] = A[i]; //将A[i]暂存到A[0]
		int low = 1; //设置折半查找的范围
		int high = i - 1;
		while(low <= high) { //折半查找(默认递增有序)
			int mid = (low + high) / 2; //取中间点
			if(A[0] > A[mid]) { 
				low = mid + 1; // 查找右子表
			} else {
				high = mid - 1; // 查找左半子表
			}
		}
		for(int j = i - 1; j >= low; j--) {
			A[j + 1] = A[j]; //统一后移元素,空出插入位置
		}
		A[low] = A[0]; //插入操作
	}
}
📌 时间复杂度:
  • 比较次数减少 →
  • 移动次数仍为
✅ 特点:
  • 稳定
  • 比直接插入快,但移动代价高

✅ (3)希尔排序(Shell Sort)

📌 思想:
  • 缩小增量排序:先对相距较远的元素进行插入排序,逐步缩小间隔
📌 增量序列(常见):
  • d1=n/2,d2=n/4,...,dk=1
📌 时间复杂度:
  • 最好: (理论值)
  • 最坏:
  • 平均:
✅ 特点:
  • 不稳定
  • 是插入排序的改进版,效率更高

相关推荐
cpp_250112 分钟前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
米尔的可达鸭3 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana23 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
Frostnova丶4 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面6 小时前
顺序表的按值查找
数据结构·c++·算法
延凡科技6 小时前
延凡科技 - 发生器设备管理控制系统:AI 驱动的全生命周期智能管控方案
大数据·数据结构·人工智能·算法
小肝一下7 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~7 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石7 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
Java面试题总结7 小时前
区间树:反向映射的前置数据结构
java·前端·数据结构