方法一:构造findpos函数找到递归边界代码主体段简洁且quick_sort函数也更为简洁用findpos函数找到了j代替了函数内部进行的比较,但是这个findpos函数的逻辑我也不是非常清楚。
#include<stdio.h>
int Findpos(int* p, int l, int r) {
int val = p[l];
while (l < r) {
if (p[r] > val)
r--;
p[l] = p[r];
if (p[l] < val)
l++;
p[r] = p[l];
}
p[l] = val;
return l;
}//用来找递归边界
void quick_sort(int* p, int l, int r) {
if (l >= r)
return;
else {
int val = p[l];
int j = Findpos(p, l, r);
p[j] = val;
quick_sort(p, l, j - 1);
quick_sort(p, j + 1, r);
}
}
int main()
{
int q[100];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
quick_sort(q,0, n-1);
for (int i = 0; i < n; i++)
printf("%d ", q[i]);
return 0;
}
思路二: 直接在quick_sort函数内部一气呵成,定义比较对象val=a[0],定义i,j分别指向头部和尾部若a[i]<val则i+1,最终使得a[i]之前的数全部比a[i]小,同理,使得a[j]右边的数全部比a[j]大。若此时i依然小于j则交换a[i],a[j],直至i=j.此时令pos = i = j,pos左边的数全比val小,pos右边的数全比val大,这时就对pos左右两边边的数再进行一次quick_sort在函数中调用函数即递归了。