快速排序

举报
花狗Fdog 发表于 2021/03/25 22:39:38 2021/03/25
【摘要】 快速排序 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。 快速排序过程图: 快速排序和归并排序有一些相同点和一些不同点,比如两种都使用了分治的思想,都是...

快速排序

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

快速排序过程图:
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-完成的时候,此时令循环结束)。


代码

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;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Fdog_/article/details/113785789

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。