思路
假如有8个数,
1)让前一个数 a[j] 和后一个数 a[j+1] 对比,如果前面的数大,就交换,这样一轮下来,最大的数就在最后了,下一轮就不用比较最后一个数了。
2)假设要比较 i 轮,因为最后一轮剩个最小数就不用比了,所以i最大为7,而i是从零开始计数,那么i < 7,如果有n个数,i<n-1;
3)8个数,就需要比较7次,所以第一轮比较7次,比完之后最后一个数最大,那么第二轮就只比较6次,可以看出来,第一轮 a[j + 1] 最大为 a[7] ,可以得出公式 j + 1 <= 7 ;第二轮不用比较最后一个数,j + 1 <= 6。。。以此类推。
就可以看出规律, j + 1 <= 8 -1- i 相当于 j <= 8- 2- i 相当于 j < 8 -1- i,如果8是未知数n,那么j<n-1-i。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[] = {12,2,66,666,23,27,21,5} ;
int t, i, j, n;
n = sizeof(a) / sizeof(int);
for(i = 0; i < n-1 ; i++)
{
for(j = 0; j < n -1 - i; j++)
{
if(a[j] > a[j + 1])
{
t = a[j + 1];
a[j + 1] = a[j];
a[j] = t;
}
}
}
for(i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
结果
2 5 12 21 23 27 66 666
同理可得, a[j] 和 a[j+1] ,如果后面的数大交换。
if(a[j] < a[j + 1])
可以得出由大到小排序
666 66 27 23 21 12 5 2