快速排序(C语言)

一、步骤

快速排序的基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止

1.首先,先确定一个元素作为关键值赋值到变量keyi中(keyi保存的是该元素的坐标,即数组的下标)

2.其次,用变量left保存数组的左边左边,right保存数组的右边坐标

3.然后right先向左边开始走,直到找到小于keyi的元素停止

4.right停止后,left开始向右侧找,找到大于keyi的元素停止

5.将left和right位置的元素互换,然后重复3、4步

6.直到left和right相遇后,将left赋值给keyi。到此keyi左侧的元素全部小于keyi处的元素,右侧的元素全部大于keyi处的元素,整个数组便成为[left,keyi-1]keyi[keyi+1,right],这样就确定了一个元素的位置

快速排序有三种方法:hoare版本、挖坑法和前后指针版本

初始数组:

1.hoare版本

图片详解:

2.挖坑法

3.前后指针版本

图片详解:

这里的keyi保存的是关键值的坐标

二、代码

1.hoare版本

复制代码
int PartSort1(int* arr, int left, int right)
{
	int keyi = left; //keyi不可以赋值为0,因为传过来的数组left不一定是0
	while (left < right)
	{
		while (left < right && arr[right] >= arr[keyi]) //右边找小,找到小于keyi的停止
		{
			right--;
		}
		while (left < right && arr[left] <= arr[keyi]) //左边找大,找到大于keyi的停止
		{
			left++;
		}
		Swap(&arr[left], &arr[right]);
	}
	Swap(&arr[left], &arr[keyi]);//此时left == right
	keyi = left;

	return keyi;
}
//[begin,end]
void QuickSort(int* arr, int left, int right)
{
	if (left >= right) // 1.当数组中只剩一个元素时返回,不需要排序
	{				   // 2.当数组不存在时返回,即left > right
		return;
	}

	int keyi = PartSort1(arr, left, right);//[left,keyi,right]

	QuickSort(arr, left, keyi - 1); //[left,kryi-1]keyi[keyi+1,right]
	QuickSort(arr, keyi + 1, right);
}

2.挖坑法

复制代码
int PartSort2(int* arr, int left, int right)
{
	int key = arr[left];
	while (left < right)
	{
		while (left < right && arr[right] >= key)
		{
			right--;
		}
		arr[left] = arr[right];
		while (left < right && arr[left] <= key)
		{
			left++;
		}
		arr[right] = arr[left];
	}
	arr[left] = key;

	return left;
}
//[begin,end]
void QuickSort(int* arr, int left, int right)
{
	if (left >= right) // 1.当数组中只剩一个元素时返回,不需要排序
	{				   // 2.当数组不存在时返回,即left > right
		return;
	}

	int keyi = PartSort2(arr, left, right);//[left,keyi,right]

	QuickSort(arr, left, keyi - 1); //[left,kryi-1]keyi[keyi+1,right]
	QuickSort(arr, keyi + 1, right);
}

3.前后指针版本

复制代码
int PartSort3(int* arr, int left, int right)
{
	int keyi = left;
	int prev = left;
	int cur = left + 1;
	while (cur <= right)
	{
		if (arr[cur] < arr[keyi] && prev != cur)
		{
			++prev;
			Swap(&arr[cur], &arr[prev]);
		}
		cur++;
	}
	Swap(&arr[prev], &arr[keyi]);
	keyi = prev;

	return keyi;
}
//[begin,end]
void QuickSort(int* arr, int left, int right)
{
	if (left >= right) // 1.当数组中只剩一个元素时返回,不需要排序
	{				   // 2.当数组不存在时返回,即left > right
		return;
	}

	int keyi = PartSort3(arr, left, right);//[left,keyi,right]

	QuickSort(arr, left, keyi - 1); //[left,kryi-1]keyi[keyi+1,right]
	QuickSort(arr, keyi + 1, right);
}
相关推荐
源代码•宸31 分钟前
MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)
数据结构·数据库·经验分享·b树·mysql·b+树·b-树
阿群今天学习了吗5 小时前
“鱼书”深度学习进阶笔记(3)第四章
人工智能·笔记·python·深度学习·算法
IT猿手5 小时前
2025年最新原创多目标算法:多目标酶作用优化算法(MOEAO)求解MaF1-MaF15及工程应用---盘式制动器设计,提供完整MATLAB代码
算法·数学建模·matlab·多目标优化算法·多目标算法
数据智能老司机8 小时前
图算法趣味学——最大流算法
数据结构·算法·云计算
秋难降9 小时前
【数据结构与算法】———深度优先:“死磕 + 回头” 的艺术
数据结构·python·算法
数据智能老司机9 小时前
图算法趣味学——图着色
数据结构·算法·云计算
数据智能老司机9 小时前
图算法趣味学——启发式引导搜索
数据结构·算法·云计算
John.Lewis9 小时前
数据结构初阶(8)二叉树的顺序结构 && 堆
c语言·数据结构·算法
SimonSkywalke10 小时前
基于知识图谱增强的RAG系统阅读笔记(七)GraphRAG实现(基于小说诛仙)(一)
算法
再睡一夏就好10 小时前
【排序算法】④堆排序
c语言·数据结构·c++·笔记·算法·排序算法