问题:一组数字:21,25,11,32,12,35,55,77,66,写程序按照下面排序。(第1个数最大,第2个数最小,第3个数是剩下数中最大的,第4个是剩下数中最小的……)
我的思路:
1. 在长度为n的序列中找出最大数和最小数,分别与第一、第二个元素进行交换。
2. 递归调用本身,对n-2长度的原序列中的子序列进行同样处理。
代码:
#include <stdio.h>
#define LEN 9
int a[LEN] = { 21, 25, 11, 32, 12, 35, 55, 77, 66 };
void swap(int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void sort(int start, int end)
{
int i, max, min;
if (start < end) {
for (i = max = min = start; i <= end; i++) {
if (a[i] > a[max])
max = i;
if (a[i] < a[min])
min = i;
}
swap(start, max);
swap(start+1, min);
sort(start+2, end);
}
}
int main(void)
{
int i;
sort(0, LEN-1);
for (i = 0; i < LEN; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
我们可以很简单地把递归改成循环:
void sort(int start, int end)
{
int i, j, max, min;
for (i = start; i < end; i++) {
for (j = max = min = i; j < end; j++) {
if (a[j] > a[max])
max = j;
if (a[j] < a[min])
min = j;
}
swap(i, max);
swap(i+1, min);
}
}
时间复杂度为O(n^2)。