快速排序
要排序的区间是[begin, end]
0.begin < end
1,val = arr[begin]
2.l = begin, r = end
2.1保证l< r
2.2从r往前找到一个小于val的值,r是是指向这个值
2.3从l往后找到一个大于等于val的值,l是指向这个值的
2.4交换l和r的值。
2.5如果l==r,arr[l] = val;
2.6否则回到2.1
3.假如已确定的值的下标是pos
递归将[begin, pos - 1]排序,递归将[pos + 1, end]排序
#include<stdio.h>
void quick_sort(int a[],int begin,int end);
int main()
{
int a[1000],i,n;
printf("请输入数组个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&a[i]);
}
printf("排序前的数组为:");
for(i=0;i<n;i++)
printf("a[%d] = %d\t",i,a[i]);
printf("\n");
quick_sort(a,0,n-1);
printf("排序后的数组为:");
for(i=0;i<n;i++)
printf("a[%d] = %d\t",i,a[i]);
printf("\n");
return 0;
}
void quick_sort(int a[],int begin,int end)
{
int key,l,r,t,j;
if(begin<end) //0.begin < end
{
key = a[begin]; //1,val = arr[begin]
l = begin; //2.l = begin, r = end
r = end;
while(l<r) //保证l< r
{
while(l<r&&a[r]>=key) //2.2从r往前找到一个小于val的值,r是是指向这个值
{
r--;
}
while(l<r&&a[l]<=key) //2.3从l往后找到一个大于等于val的值,l是指向这个值的
{
l++;
}
if(l!=r) //2.4交换l和r的值。
{
t=a[l];
a[l]=a[r];
a[r]=t;
}
if(l==r) //2.5如果l==r,arr[l] = val;
{
j=l;
t=a[begin]; //易出错不能写成t=key;因为只是把key的值改了。
a[begin]=a[l];
a[l]=t;
}
}
quick_sort(a,begin,j-1); //递归将[begin, pos - 1]排序,递归将[pos + 1, end]排序
quick_sort(a,j+1,end);
}
}