zoukankan      html  css  js  c++  java
  • 新手讲排序:详细讲解快速排序

    quick_sort(int A[],int start,int end);

    int   i=start ,  j=end  ,  pivot;

    一.  先选择一个基准pivot,3种选择方式

                               1.固定位置,开头或结尾或中间

               2.随机位置,采用随机数产生start和end之间的数

               3.平衡位置,即从开头结尾中间三个数中选择他们的中间数,达到平衡的目的

    二. 通过比较与该基准的关系,将原数组分为元素个数比较接近的两个数组,

           1.while(i<j){

                  while(A[i]<pivot)    i++;          //这个从前往后找,找到大于基准的数

           while(A[j]>pivot)   j--;           //这个从后往前找,找到小于基准的数

                   swap(A[i],A[j]);                   //交换两个数

               }

    三.接下来对两个子数组分别进行快排

          if(i < end )     quick_sort(A,i,end);      //因为从上面的步骤,i 之前的都是小于基准的数

          if(j > start)     quick_sort(A,start,j);    //同理

    四.  上面递归进行到一定程度的时候,将不会再满足i <end 和 j>start 条件,这时候快排完成,递归完毕

    平均时间复杂度O(nlogn);

    最坏时间复杂度O(n^n) ; 此时因为选取的基准不好,每一次都分成两个个数相差很多甚至一个为空的数组

    渐进复杂度: O(nlogn);

    它是不稳定的排序算法,因为快速排序可能会改变相等的两个数之间的相对位置,如{1,2,2,3,4,5}

                                   排序之后第一个2便到了第二个2的后面

  • 相关阅读:
    pdf 去水印 比较好用
    ffmpeg从视频中每隔几秒提取一张图片
    tampermonkey 网盘直链下载助手
    淘工厂买的usb 蓝牙5.0 外置台式机 适配器(下载)
    Apache Doris 轻松入门和快速实践
    一步一步编译最新版Apache Doris 0.15版本的详细过程
    go使用msgpack
    服务接口杂谈
    关于真伪3层所讨论的
    jattach最近的一些更新
  • 原文地址:https://www.cnblogs.com/jijiji/p/4785672.html
Copyright © 2011-2022 走看看