• 浅谈快速排序


    快速排序(Quicksort)

    1.定义

    快速排序是对冒泡排序的一种改进算法。

    2.基本思路

    快速排序的思路大概就是在冒泡排序的基础之上增添了二分的思想。

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

    简而言之:将一个序列分成两份,一份中的所有数比另外一份中的任何一个数大,重复操作直到序列有序。

    3.应用思路

    假设有一个等待排序的序列 $ {a[l],a[l+1],a[l+2].....a[r]} $

    1.选定分界值

    首先设定一个分界值,将这个序列分为两个部分

    2.排序

    将大于或等于分界值的数放在数组右边,小于分界值的数放在到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

    3."套娃"

    此时开始"套娃",对左边和右边分解完的序列再次进行重复操作,递归(套娃)下去直到序列有序即可。

    3.代码实现

    当然不是这个啦(雾,stl大法好

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[110];
    void quicksort(int l,int r){
    	sort(a+l,a+l+r);
    	return;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	quicksort(1,n);
    	for(int i=1;i<=n;++i){
    		printf("%d ",a[i]);
    	}printf("
    ");
    	return 0;
    } 
    

    下面这个代码要想过 $ luogu $要改一改,自己看吧

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[100010];
    void quicksort(int l,int r){
    	int i,j;
    	i=l,j=r;
    	int mid=a[l+r>>1];
    	do{
    		while(a[i]<mid) i++;
    		while(a[j]>mid) j--;
    		if(i<=j){
    			swap(a[i],a[j]);
    			i++;j--;
    		}
    	}while(i<=j);
    	if(l<j) quicksort(l,j);
    	if(i<r) quicksort(i,r);
    	return;
    }
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	quicksort(1,n);
    	for(int i=1;i<=n;++i){
    		if(i<n) printf("%d ",a[i]);
    	}printf("
    ");
    	return 0;
    } 
    

    4.讲在最后

    快速排序的时间复杂度为 $ O(nlog_n) $ ,这是一个不稳定的算法,同样的时间复杂度的情况下,归并排序则是稳定的,归并排序可以说是排序算法中最优的一种了。

    事实上,作为一名c++选手,平时一般都不会这样写, $ sort $ 多香啊,并且 $ sort $ 由于其内部具体原因,其稳定性可以得到保证,甚至可超越 $ O(nlog_n) $

    如果想了解更多关于 $ sort $ 的芝士可以看一下这篇洛谷日报

    浅析sort

  • 相关阅读:
    Quartz 基本概念及原理
    quartz-2.2.x 快速入门 (1)
    hive踩过的小坑
    spring profile 多环境配置管理
    win10窗口设置眼睛保护色
    优雅地在markdown插入图片
    Using Spring Boot without the parent POM
    isDebugEnabled作用
    Log 日志级别
    为什么要使用SLF4J而不是Log4J
  • 原文地址:https://www.cnblogs.com/donkey2603089141/p/12328993.html
Copyright © 2020-2023  润新知