快速排序选取数组一个元素,把大于它的留在右边, 小于它的留在左边,同时也为这个元素找到了自己的位置。移动下标时需要注意不要越界。
#include <stdio.h>
void printa(int a[], int n)
{
int i;
for(i=0; i<n; i++) printf("%d ", a[i]);
printf("\n");
}
void qsort(int arr[], int left, int right)
{
int i, j;
int t;
t = arr[left];
i = left;
j = right;
if (i<j) {
loop:
while (arr[j]>t) --j;
if (i<j) {
arr[i] = arr[j];
while(arr[i]<t) ++i;
if (i <j) {
arr[j] = arr[i];
goto loop;
}
else {
arr[j] = t;
i=j;
}
}
else {
arr[i]= t;
}
}
printa(arr, 10);
if (left <i-1) qsort(arr,left, i-1);
if (right >i+1) qsort(arr, i+1, right);
}
int main()
{
int a[10];
int i;
loop:
printf("input 10 numbers: ");
for(i=0; i<10; i++) {
if (scanf("%d", &a[i]) <=0)return 0;
}
while(getchar()!='\n');
qsort(a, 0, 9);
printa(a,10);
goto loop;
}
如果考虑数组含有重复元素,dec j 和inc i 的循环条件要变成含等于的 >= 和 <=,这时有越界危险了,还要与上 i<j 。