标签:
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的后面
标签:
原文地址:http://www.cnblogs.com/jijiji/p/4785672.html