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

    排序算法基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分继续进行排序,以达到整个记录有序。

    排序算法中Partition函数的作用可通过下图描述:

    首先,定义i、j,i指向首元素的前一个位置,j指向首元素。

    然后,比较第j个元素和第r个元素大小,若第j个元素小,则i+1,交换第i个元素和第j个元素

    最后,循环结束,交换第i+1个元素和第r个元素

    通过上面的步骤,就可以达到将待排序的元素分割成两个独立部分,并且前面部分最大元素小于后面部分最小元素。

    Click To expand

    快速排序
     1 #include <iostream>
    2 using namespace std;
    3
    4
    5 //元素交换
    6 void swap(int &a,int &b)
    7 {
    8 int temp=a;
    9 a=b;
    10 b=temp;
    11 }
    12
    13 /*///////////////////////////////////////////////
    14 快速排序
    15 */
    16 int Partition(int *a,int p,int r)
    17 {
    18 int i = p-1;
    19 int j = p;
    20 for(j=p;j<r;j++)
    21 {
    22 if(a[j]<a[r])
    23 {
    24 i++;
    25 swap(a[i],a[j]);
    26 }
    27 }
    28 swap(a[i+1],a[r]);
    29 return i+1;
    30 }
    31
    32 void QuickSort(int *a,int p,int r)
    33 {
    34 if(p<r)
    35 {
    36 int q = Partition(a,p,r);
    37 QuickSort(a,p,q-1);
    38 QuickSort(a,q+1,r);
    39 }
    40 }
    41 /////////////////////////////////////////////////
    42
    43
    44 int main()
    45 {
    46 int n,i,a[20];
    47 cout<<"请输入数组元素n:"<<endl;
    48 cin>>n;
    49 cout<<"请输入"<<n<<"个元素:"<<endl;
    50 for(i=0;i<n;i++)
    51 cin>>a[i];
    52 QuickSort(a,0,n-1);
    53 for(i=0;i<n;i++)
    54 cout<<a[i]<<" ";
    55 cout<<endl;
    56 return 0;
    57 }

    时间复杂度解析:

    根据快速排序的过程分析,可用表达式  T (n) 2T (n/2) + Θ(n)  表示其排序的时间复杂度,可求得T (n) = O(n lg n). 即时间复杂度为O(nlogn)

  • 相关阅读:
    Samara SAU ACM ICPC 2013-2014 Quarterfinal Qualification Contest
    German Collegiate Programming Contest 2013:E
    German Collegiate Programming Contest 2013:B
    LA 4975
    Codeforces Beta Round #1
    poj 3667 Hotel
    Codeforces Round #207 (Div. 2)
    【USACO 2.3.1】最长前缀
    【USACO 2.2.4】派对灯
    【USACO 2.2.3】循环数
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2197940.html
Copyright © 2011-2022 走看看