快速排序

快速排序是一种比较常用的排序算法,平均时间复杂度(nlogn),最差(n*n);

STL库中的sort函数用的一般用的就是快速排序,

快速排序的原理如下:

对于一段未排序的数字(1,12,23,5,2,24,6,21,25,15,32,11,45,13,)

首先选择一个基准数字x,然后从数列的首端开始(ls++)找第一个大于或等于x的数字,并记录位置,

再从数列的末端开始找(rs--)第一个小于x的数字,并记录位置,

然后交换两个数字,当ls==rs时停止,这是比x小的数字在ls左边,比x大或者等于x的数字在ls右边,

然后递归的再对ls左边和ls右边的数字进行同样的操作;

直到要排序的数列只包含一个数字;

比如上面的数列以最后一个数为基准数(13)经过一次操作后是这样的(1,12,11,5,2,6,13,21,25,15,32,23,45,24);

然后是(1,2,5,6,11,12,13,21,23,15,24,25,45,32),

(1,2,5,6,11,12,13,21,23,15,23,24,25,32,45),

(1,2,5,6,11,12,13,15,23,21,24,25,32,45),

(1,2,5,6,11,12,13,15,21,23,24,25,32,45),

c++实现如下

 1 void qsort(int st,int en){
 2     if(st>=en) return ;
 3     int ls=st,rs=en;
 4     int c=a[en];
 5     while(ls<rs){
 6         while(a[ls]<c&&ls<rs) ls++;
 7         while(a[rs]>=c&&ls<rs) rs--;
 8         //swap(a[ls],a[rs]);
 9         int t=a[ls];
10         a[ls]=a[rs];
11         a[rs]=t;
12     }
13     //swap(a[ls],a[en]);
14     int t=a[ls];
15     a[ls]=a[en];
16     a[en]=t;
17     qsort(st,ls-1);
18     qsort(ls+1,en);
19 }
View Code

 

posted @ 2017-07-08 17:03  林探惜  阅读(90)  评论(0编辑  收藏  举报