思路:以一个数为基准,从它左边找比基数大的数a[i],从它右边找比基数小的数a[j],将两数交换,再继续遍历数组往下找,再用递归来不断缩小区间范围去执行交换。(while循环前提条件是:i<=j)
方法1:
void qsort(int a[], int l, int r)
{
int i = l, j = r, flag = a[(l + r) / 2];//i定义为哨兵左边left的数组下标
do //j定义为哨兵右边right的数组下标
{
while (a[i] < flag) i++; //从左边找比哨兵(flag)大的数
while (a[j] > flag) j--; //从右边找比哨兵(flag)小的数
if (i <= j) //若不符以上两个while,则说明找到左大右小的数
{ //此时在i<=j的前提下,去交换a[i]与a[j]
int t = a[i]; a[i] = a[j]; a[j] = t;
i++; //再继续往下遍历数组去找符合左边比flag大,右边比flag小的数
j--;
}
} while (i <= j); //为循环的前提,倘若i>j则无意义 返回return
if ( l< j) qsort(a, l, j); //不断缩小范围去执行排序
if (i < r) qsort(a, i, r);
}
方法二
void qsort(int* a, int begin, int end) {
if (begin > end)
return; //表明这种情况无意义
int tmp = a[begin]; //将基准tmp先赋值为a[begin]
int i = begin;
int j = end;
while (i != j) { //与法一中含义一样
while (a[j] >= tmp && j > i)
j--;
while (a[i] <= tmp && j > i)
i++;
if (j > i) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
} //从循环出来后则表明i=j,说明找到了基准tmp=a[i]=a[j]
a[begin] = a[i]; //因此结合第四行,交换a[begin]和a[i](此时为基准值)两个的值
a[i] = tmp;
qsort(a, begin, i - 1);//再用递归 左区间
qsort(a, i + 1, end); //右区间
}