新手讲排序:详细讲解快速排序

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

原文地址:https://www.cnblogs.com/jijiji/p/4785672.html