Posted in C/C++ 我抢沙发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void myswap(int *a, int *b)
{
	int i = *a;
	*a = *b;
	*b = i;
}
 
int get_pivot(int *array, int l, int r)
{
	int i = rand()%(r-l+1)+l;//生成 [l, r]之间的随机数
	myswap(array+l, array+i);//把随机得到的基准放在array[l]
	return array[l];
}
 
void myqsort(int array[], int left, int right)
{
	if(left<right)
	{
		get_pivot(array, left, right); //随机化
		int x = array[left]; //以此为基准
		int l = left;         //待分的其实是[left+1, right], 但l和r分别设成了left, right+1. 因为
		int r = right+1; //下面的循环中先++l,--r再访问。
		while(1)
		{
			while(array[++l] < x && l<right);
			while(array[--r] > x && r>left);
			if(l<r) myswap(array+l, array+r);
			else break;
		}//当循环退出时,array[r]小于等于x, array[l]大于等于x
		myswap(array+left, array+r);// 所以,把较小的array[r]同array[left]交换
		myqsort(array, left, r-1);
		myqsort(array, r+1, right);
	}
}
August 23, 2010