zoukankan      html  css  js  c++  java
  • #排序算法#【4】快速排序

      快速排序法是对冒泡排序的一种改进,本来是要和冒泡排序写在一个文章里的,不过前两天刚开始在递归调用的时候没有完全理解,昨天晚上google了一把发现原来自己理解错了,我看的这个教材没有写清楚,今天早上调试了一把终于成功。

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

      

      快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:

        (1)从数列中挑出一个元素,称该元素为“基准”。

        (2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。

        (3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

         

        上图中只是以69为基准数的两个步骤的图示,其实一遍下来以后,应该是比69小的都排在它左边,比69大的都排在它的右边。

        贴上一张在万能的百度中找到的关于快速排序的动画图,可能稍微好理解一些:

          

    具体代码如下:

     1 #include <stdio.h>
     2 #include "CreateData.c"  //生成随机数文件
     3 
     4 #define MAXSIZE 10
     5 
     6 //快速排序分割出基准数下标
     7 int Partition(int a[],int left,int right){
     8     int base;
     9     base = a[left];
    10     while(left < right){
    11         while(a[right]>base && left<right)    //右边的数大于基准数
    12             right--;
    13         a[left] = a[right];
    14 
    15         while(a[left]<base && left<right)
    16             left++;
    17         a[right] = a[left];
    18     }
    19 
    20     a[left] = base;        //保存基准数
    21 
    22     return left;
    23 }
    24 
    25 //快速排序算法实现
    26 void QuickSort(int a[],int left,int right){
    27     int i;
    28 
    29     if(left < right){
    30         i = Partition(a,left,right);
    31 
    32         QuickSort(a,left,i-1);
    33         QuickSort(a,i+1,right);
    34     }
    35 }
    36 
    37 int main(){
    38     int a[MAXSIZE];
    39     int i;
    40 
    41     if(!CreateData(a,100,10,MAXSIZE)){
    42         printf("生成随机数失败
    ");
    43         return 0;
    44     }
    45 
    46     printf("排序前:");
    47     for(i = 0 ; i<MAXSIZE ;i++)
    48         printf("%d ",a[i]);
    49 
    50     QuickSort(a,0,MAXSIZE-1);    
    51     
    52     printf("
    排序后:");
    53     for(i = 0 ; i<MAXSIZE ;i++)
    54         printf("%d ",a[i]);
    55 
    56     return 1;
    57 }

    时间复杂度:O(n*lgn)
    最坏:O(n^2)
    空间复杂度:O(n*lgn)

    快速排序对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
    通常是用于排序的最佳选择。因为,基于比较的排序,最快也只能达到O(nlgn)。

  • 相关阅读:
    MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案
    WCF中的ServiceHost初始化两种方式
    正则表达式规则
    常用正则表达式
    Visual Studio 2017使用Asp.Net Core构建Angular4应用程序
    斑马打印机ZT410中文打印
    CNPM 安装 for angularjs
    MAC OS X&Vmware
    HBase
    SQL 和 NoSQL 比较
  • 原文地址:https://www.cnblogs.com/fanchangfa/p/3762644.html
Copyright © 2011-2022 走看看