数据结构笔记之三种高级排序

本文介绍了三种高级排序算法:快速排序、归并排序和基数排序。快速排序通过一趟排序将序列分成两部分,递归进行排序。归并排序采用2-路归并,保证稳定性但空间复杂度较高。基数排序则是一种借助多关键字思想的排序方法,适合处理数字排序。三种排序的时间复杂度分别为O(nlogn)、O(nlogn)和O(d(n+rd))。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、快速排序

此快速排序为基础的快速排序,可改进、优化。

  • 基本思想(来自《数据结构》,严蔚敏、吴伟民编著,下同):
    通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

  • 例子

  1. 以序列中的第一个数(83)为基准数,使 X=基准数:
    在这里插入图片描述
  2. 从后往前依次与 X 比较,找到小于 X 的数(15),并与 X 交换:
    在这里插入图片描述
  3. 从前往后依次与 X 比较,找到大于 X 的数(84),并与 X 交换:
    在这里插入图片描述
  4. 重复第2步:
    在这里插入图片描述
  5. 重复第3步:
    在这里插入图片描述
  6. 一直重复到基准数前都是小于基准数的数,基准数后都是大于基准数的数:
    在这里插入图片描述
    至此完成第一次排序,再分别对基准数前、后的序列按照1-6步操作,直到完成排序。
  • 算法(伪代码,来自《数据结构》,严蔚敏、吴伟民编著,下同):
#define MAXSIZE 20				//一个用作示例的小顺序表最大长度
typedef int KeyType;			//定义关键字类型为整数类型
typedef struct {
   
	KeyType key;				//关键字项
	InfoType otherinfo;			//其他数据项
}RedType;						//记录类型

typedef struct {
   
	RedType r[MAXSIZE + 1];		//r[0]闲置或用作哨兵单元
	int length;					//顺序表长度
}SqList;						//顺序表类型

int Partition(SqList &L, int low, int high)
{
   
	// 交换顺序表 L 中子表 r[low.high] 的记录,枢轴记录到位,并返回其所在位置,
	// 此时在它之前(后)的记录均不大(小)于它。
	L.r[0] = L.r[low];						//用子表的第一个记录作枢轴记录
	int pivotkey = L.r[low].key;			//枢轴记录关键字
	while (low<high)						//从表的两端交替地向中间扫描
	{
   
		while (low < high&&L.r[high].key >= pivotkey) --high;
		L.r[low] = L.r[high];				//将比枢轴记录小的记录移到低端
		while (low < high&&L.r[low].key <= pivotkey) ++low;
		L.r[high] = L.r[low];				//将比枢轴记录大的记录移到高端
	}
	L.r[low
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值