zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序由C. A. R. Hoare在1962年提出。

    它的基本思想是:

    通过一趟排序将要排序的数据分割成独立的两部分,

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

     快速排序是一种交换类的排序,它同样是分治法的经典体现

    在一趟排序中将待排序的序列分割成两组,其中一部分记录的关键字均小于另一部分。然后分别对这两组继续进行排序,以使整个序列有序。在分割的过程中,枢纽值的选择至关重要,采取三位取中法,可以很大程度上避免分组"一边倒"的情况。

    快速排序平均时间复杂度也为O(nlogn)级。

    例子:

    三数取中:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<string>
     6 #include<queue>
     7 #include<cmath>
     8 #define ll long long
     9 #define DB double
    10 #define inf 214748360000
    11 #define mod 1000000007
    12 using namespace std;
    13 inline int read()
    14 {
    15     int x=0,w=1;char ch=getchar();
    16     while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
    17     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    18     return x*w;
    19 }
    20 int n,a[100003];
    21 void qsort(int l,int r)
    22 {
    23     int mid=a[(l+r)/2],i,j;
    24     i=l;j=r;
    25     do{
    26         while(a[i]<mid) i++;
    27         while(a[j]>mid) j--;
    28         if(i<=j)
    29         {
    30             swap(a[i],a[j]);
    31             i++;j--;
    32         }
    33     }while(i<=j);
    34     if(l<j) qsort(l,j);
    35     if(i<r) qsort(i,r);
    36 }
    37 int main()
    38 {
    39     n=read();
    40     for(int i=1;i<=n;++i) a[i]=read();
    41     qsort(1,n);
    42     for(int i=1;i<=n;++i) printf("%d ",a[i]);
    43     return 0;
    44 }
    View Code

    在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值

  • 相关阅读:
    hdu-1142(记忆化搜索+dij)
    hdu-1140(求距离,精度判断)
    hdu-1131(卡特兰数+大数)
    hdu-1130(卡特兰数+大数乘法,除法模板)
    hdu-1129(模拟题)
    hdu-1128(数学问题,筛数)
    hdu-1124(数学问题,求n!的尾零的个数)
    hdu-1115(计算多边形重心)
    hdu-1121(差分法--数学问题)
    表达式求值(堆栈)
  • 原文地址:https://www.cnblogs.com/adelalove/p/8485139.html
Copyright © 2011-2022 走看看