八大排序(三)快速排序
快速排序是在实际中最常用的一种排序算法,速度快,效率高,就像名字一样,快速排序是最优秀的一种排序算法。
虽然在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;
}