前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >快速排序

快速排序

作者头像
花狗Fdog
发布2022-06-17 09:24:08
1550
发布2022-06-17 09:24:08
举报
文章被收录于专栏:花狗在Qt花狗在Qt

快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。

快速排序过程图:

hgfh
hgfh

快速排序和归并排序有一些相同点和一些不同点,比如两种都使用了分治的思想,都是递归+排序,不同点在于归并排序是先递归后排序,而快速排序是先排序,后递归。


快速排序原理

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; [1] 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; [1] 3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换; [1] 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换; [1] 5)重复第3、4步,直到 i 等于 j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外, i 等于 j 这一过程一定正好是i+或j-完成的时候,此时令循环结束)。


代码

代码语言:javascript
复制
void func(int * a, int s, int e)
{
	//快速排序使用的是分治法,我们可以使用递归来重复操作

	if (s == e)return;
	//排序
	int i = s;
	int j = e;
	int data = a[s];
	int arrint = s;
	while (j != i)
	{
		//从右往左遍历
		for (int f = j; f >=s; f--)
		{
			if (j == i)	break;
			if (data <= a[f])
			{		
				int temp = a[f];
				a[f] = a[arrint];
				a[arrint] = temp;
				arrint = f;
				j = f - 1;
				break;
			}
			j = f - 1;
		}
		//从左往右遍历
		for (int f = i; f <= e; f++)
		{
			if (j == i)	break;
			if (data >= a[f])
			{
				int temp = a[f];
				a[f] = a[arrint];
				a[arrint] = temp;
				arrint = f;
				i = f+1;
				break;
			}
			i = f + 1;
		}
	}
	int min = s + (e - s) / 2;
	func(a, s, min);
	func(a, min + 1, e);
}

int main()
{
	//归并的参数值 和快速参数值的不同作用
	int a[] = { 8,7,10,12,4,5,6,9 };
	func(a, 0, 7);

	for (int i = 0; i <8; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速排序
  • 快速排序原理
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档