快速排序
快速排序是一种比较常用的排序算法,平均时间复杂度(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 }