• 八大排序(三)快速排序


    八大排序(三)快速排序


    快速排序是在实际中最常用的一种排序算法,速度快,效率高,就像名字一样,快速排序是最优秀的一种排序算法。
    虽然在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;
    }
  • 相关阅读:
    js浅拷贝和深拷贝
    使用slice和concat对数组的深拷贝和浅拷贝
    JS数组常用方法---8、concat方法
    JS数组常用方法---7、join方法
    js中将类数组转换为数组的几种方法
    JS 使用const声明常量的本质(很多人都有误解)
    JS中对象数组按照对象的某个属性进行排序
    vue源码分析参考---2、数据代理
    vue源码分析参考---1、准备工作
    ES6课程---5、形参默认值
  • 原文地址:https://www.cnblogs.com/OctopuSS/p/13992293.html
Copyright © 2020-2023  润新知