八大排序(三)快速排序

八大排序(三)快速排序


快速排序是在实际中最常用的一种排序算法,速度快,效率高,就像名字一样,快速排序是最优秀的一种排序算法。
虽然在c++中可以直接调用sort进行快排,但还是需要了解他的原理


分治

快速排序采用分治的思想

因此我在这里简单介绍一下分治,简单来说就是“分而治之”,把一个复杂的问题分成两个或更多的相同或相似的子问题,
再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在计算机科学中,
分治法就是运用分治思想的一种很重要的算法。分治法是很多高效算法的基础,如排序算法(快速排序,归并排序)。

分治法经典例子:二分查找法
eg:例如,有一个[l,r]的有序数列,你要找某个数(A)在第几位,你可以先用中间数(B)和A比大小,若果相等就找到了,
    若果不相等,再比较A和B的大小,若A>B则在(B,r]的部分执行上述操作,反之,在[l,B)的部分执行上述操作,以此类
    推,直到找到该数。

1概念

快速排序是指通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序。整个排序过程可以递归进行,以达到整个数据变成有序序列。

2.思路(正序)

快速排序采用分治的思想

  • 假设有一个n个数的数列
  • 首先先随机找一个数,一般找每一组数的第一个,将这组数中大于(或等于)它的数放到右边,小于的放到左边
  • 现在就有两组数据,再对每一组数据执行该操作,以此类推, 直到排好序
eg:有一个数列(49 38 65 97 76 13 27 49)

过程如下图所示

3.代码实现

#include<stdio.h> 
int a[100005],cnt;
//升序快排
void q_sort(int l, int r)//l=left,r=right,l是该数组的起始位置,r是终止位置,即[l,r]的区间
{
	if (l >= r)//排除不成立条件
		return;
	int i = l, j = r;
	int tep = a[i];
	while (i < j)	把大于中间值的数放到右边,小于的放到左边
	{
		while (i < j && a[j] >= tep) j--;
		a[i] = a[j];
		while (i < j && a[i] <= tep) i++;
		a[j] = a[i];
    }
	a[i] = tep;
	q_sort(l, i - 1);//对中间值左边进行排序(递归思想)
	q_sort(i + 1, r);//对中间值右边进行排序(递归思想)
}

int main(){
	int i,n;
	printf("输入数列长度:");
	scanf("%d", &n);
	printf("输入该数列:");
	for (i = 0; i < n; i++)//输入一组数据
		scanf("%d", a+i);
	q_sort(0, n - 1);//调用函数进行排序
	for (i = 0; i < n; i++)//输出排序后的数列
		printf("%d ", a[i]);
	return 0;
}
posted @ 2020-11-17 08:13  OctopusSS  阅读(190)  评论(0)    收藏  举报