快速排序的设计思想如下:
找出中间值作为基准值k,想办法把所有比 ‘k’ 小的都放右边,所有比‘k’大的都放左边,然后缩小start end的范围,一个是从 start->mid-1, 一个是mid+1->end
int getMid(int *data,int s,int e)
{
int m = (s+e)/2;
// 4 2 1
if(data[s] > data[m])
//交换
swap(data+s,data+m);
// 2 4 1
if(data[m] > data[e])
swap(data+m,data+e);
//2 1 4
if(data[s] > data[m])
swap(data+s,data+m);
//1 2 4
swap(data+m,data+e);
return data[e]; //这就是mid值,把它放到后面便于确定它最终位置
}
void q_sort(int *a,int start,int end)
{
//终止条件,start == end: 序列里面只有一个元素
if(start >= end)
return;
//对start end mid简单排序, 返回中间值(后期判断使用)
//这只是个代理中间值
int mid = getMid(a,start,end);
int i = start-1;
int j = end;
while(1){
while(a[++i] < mid);
while(a[--j] >= mid);//note:>= ...mid=end时会交换时都会消除...待续下次看的时候注意一下
if(i > j)
break;
swap(a+i,a+j);
}
swap(a+i,a+end);
//out_array(a,8);
//再排 分开的两个序列
//i一定会停到指向mid的那个地方while(a[++i] < mid);, 即:i所指的值的右边都比它小,而左边都比他大
q_sort(a,start,i-1);
q_sort(a,i+1,end);
}