快速排序介绍与分析

来源:互联网 发布:如何提升淘宝店铺销量 编辑:程序博客网 时间:2024/06/05 20:44

快速排序在我看来是一个对一个随机产生的序列比较高效的排序算法。和冒泡排序一样属于交换排序即排序时需要不断交换元素。

基本思想:

1.先选一个基准数字,假定这里每次选定最左边的数字作为基准数字,然后从数列最后一个元素开始与该基准数字比较(注意这里的顺序非常重要,必须从右边即序列最后一个元素开始比较,而不能从该序列第二个数字即基准数字相邻的数字开始与该基准数字做比较),一直找到那个比该基准数字小的元素的位置(假定这里从小到大排序),然后从该基准数字的下一个数字与该基准数字作比较,直至找到第一个比该基准数字大的元素,然后把刚刚找到的两个找到的两个元素交换。

2.重复着上一步操作,直至从右边找的数字的下标与从左边找的数字的下标重合,然后把事先保留的基准数字与该重合下标对应元素交换。很容易可以看到,一次这样的操作后,该基准数字便已经归位,即左边的数字都比该基准数字小,右边的数字都比该基准数字大。

3.不断递归对基准数字的两边进行着上述两步操作。

void quicksort(int* a, int left,int right){    int i,j,t,temp;    if(left>=right) //这里可以带上等于符号,如果需要排序区间只有一个数字无需进行      return;    temp=a[left]; //temp中存的就是基准数    i=left;    j=right;    while(i < j)    {           //顺序很重要,要先从右边开始找 思考一下为什么必须要从右边开始           while(a[j]>temp && i<j)                    j--;           //再找右边的           while(a[i]<=temp && i<j) //此处等于号绝对不能省略                   i++;          //交换两个数在数组中的位置,下标没有重合           if(i<j)           {                    t=a[i];                    a[i]=a[j];                    a[j]=t;           }    }    //最终将基准数归位    a[left]=a[i];    a[i]=temp;   quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程   quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程}


快速排序对于那些已经基本有序的序列的效率比较低,这或许是一个比较奇怪的事情,但是确实是这样,如果基本有序每次差不多归位的数字便会减少(这里可以考虑一种极端情况,比如需要从大到小排序,然后初始序列确实从小到大的)

不管怎么说快速排序还是效率比较高的

平均时间复杂度:O(nlog2n)   最坏情况时间复杂度:O(n^2)   最好情况复杂度:O(nlog2n)

空间复杂度:O(nlog2n)

原创粉丝点击