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的后面

  • 相关阅读:
    Ubuntu apt-get 失败验证
    网络服务器处理阻塞问题
    58、剑指offer--对称的二叉树
    57、剑指offer--二叉树的下一结点
    56、剑指offer--删除链表中重复的结点
    55、剑指offer--链表中环的入口结点
    54、剑指offer--字符流中第一个不重复的字符
    53、剑指offer--表示数值的字符串
    52、剑指offer--正则表达式匹配
    51、剑指offer--构建乘积数组
  • 原文地址:https://www.cnblogs.com/jijiji/p/4785672.html
Copyright © 2011-2022 走看看