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
