<谭> 例7.3用起泡法对10个数排序(由小到大)若有n个数。第一次将第1和第2个数比较,若第1个数大于第2个数,刚两数对调,否则不操作。第二次将第2和第3个数比较,如上操作,刚经过n-1次这样的操作,最大的数排到了最后(即所谓的沉底)。以上为第一趟操作的结果。第二趟要对余下的n-1个数作同样的操作(因为最大的数已排到最后,不必考虑)。第二趟中要作n-2次比较……依次类推可得出结论:n个数排序,要进行n-1趟比较。第一趟中比较n-1次,第 i 趟中比较 n-i 次。 #include <stdio.h>int main(){ int a[11]; /* 为了符合习惯, 第0号元素不用 */ int i, j, cup; printf("Input 10 numbers:\n"); for(i = 1; i < 11; i++) scanf("%d", &a[i]); for(i = 1; i <= 9; i++) /* 趟数 */ for(j = 1; j <= 10 - i; j++) /* 每趟要比较数 */ if(a[j] > a[j+1]) /* 前面数大于后面数刚对调 */ { cup = a[j]; a[j] = a[j+1]; a[j+1] = cup; } printf("The sorted numbers:\n"); for(i = 1; i <11; i++) printf("%d ", a[i]); return 0;} 运行结果:=============================================Input 10 numbers:4 23 68 -29 9 10 -500 799 88 -4↙The sorted numbers:-500 -29 -4 4 9 10 23 68 88 799 =============================================★ 其执行过程分析:第1趟: 第1次: 4 23 68 -29 9 10 -500 799 88 -4 第2次: 4 23 68 -29 9 10 -500 799 88 -4 第3次: 4 23 -29 68 9 10 -500 799 88 -4 第4次: 4 23 -29 9 68 10 -500 799 88 -4 第5次: 4 23 -29 9 10 68 -500 799 88 -4 第6次: 4 23 -29 9 10 -500 68 799 88 -4 第7次: 4 23 -29 9 10 -500 68 799 88 -4 第8次: 4 23 -29 9 10 -500 68 88 799 -4 第9次: 4 23 -29 9 10 -500 68 88 -4 799第2趟: 第1次: 4 23 9 -29 -500 10 68 -4 88 799 第2次: 4 23 -29 9 10 -500 68 88 -4 799 第3次: 4 23 9 -29 10 -500 68 88 -4 799 第4次: 4 23 9 -29 10 -500 68 88 -4 799 第5次: 4 23 9 -29 -500 10 68 88 -4 799 第6次: 4 23 9 -29 -500 10 68 88 -4 799 第7次: 4 23 9 -29 -500 10 68 88 -4 799 第8次: 4 23 9 -29 -500 10 68 -4 88 799……第9趟: 第1次: -500 -29 -4 4 9 10 23 68 88 799 ★ 为验证以上推论,改写程序如下:#include <stdio.h>int main(){ int a[11]; int i, j, k, cup; printf("Input 10 numbers:\n"); for(i = 1; i < 11; i++) scanf("%d", &a[i]); for(i = 1; i <= 9; i++) { printf("i=%d: \n\n", i); for(j = 1; j <= 10 - i; j++) { if(a[j] > a[j+1]) { cup = a[j]; a[j] = a[j+1]; a[j+1] = cup; } printf(" j=%d: ", j); for(k = 1; k < 11; k++) printf("%5d ", a[k]); printf("\n"); } printf("\n\n"); } return 0;} 运行结果:=========================================================================Input 10 numbers:4 23 68 -29 9 10 -500 799 88 -4↙i=1: j=1: 4 23 68 -29 9 10 -500 799 88 -4 j=2: 4 23 68 -29 9 10 -500 799 88 -4 j=3: 4 23 -29 68 9 10 -500 799 88 -4 j=4: 4 23 -29 9 68 10 -500 799 88 -4 j=5: 4 23 -29 9 10 68 -500 799 88 -4 j=6: 4 23 -29 9 10 -500 68 799 88 -4 j=7: 4 23 -29 9 10 -500 68 799 88 -4 j=8: 4 23 -29 9 10 -500 68 88 799 -4 j=9: 4 23 -29 9 10 -500 68 88 -4 799 i=2: j=1: 4 23 -29 9 10 -500 68 88 -4 799 j=2: 4 -29 23 9 10 -500 68 88 -4 799 j=3: 4 -29 9 23 10 -500 68 88 -4 799 j=4: 4 -29 9 10 23 -500 68 88 -4 799 j=5: 4 -29 9 10 -500 23 68 88 -4 799 j=6: 4 -29 9 10 -500 23 68 88 -4 799 j=7: 4 -29 9 10 -500 23 68 88 -4 799 j=8: 4 -29 9 10 -500 23 68 -4 88 799 i=3: j=1: -29 4 9 10 -500 23 68 -4 88 799 j=2: -29 4 9 10 -500 23 68 -4 88 799 j=3: -29 4 9 10 -500 23 68 -4 88 799 j=4: -29 4 9 -500 10 23 68 -4 88 799 j=5: -29 4 9 -500 10 23 68 -4 88 799 j=6: -29 4 9 -500 10 23 68 -4 88 799 j=7: -29 4 9 -500 10 23 -4 68 88 799 i=4: j=1: -29 4 9 -500 10 23 -4 68 88 799 j=2: -29 4 9 -500 10 23 -4 68 88 799 j=3: -29 4 -500 9 10 23 -4 68 88 799 j=4: -29 4 -500 9 10 23 -4 68 88 799 j=5: -29 4 -500 9 10 23 -4 68 88 799 j=6: -29 4 -500 9 10 -4 23 68 88 799 i=5: j=1: -29 4 -500 9 10 -4 23 68 88 799 j=2: -29 -500 4 9 10 -4 23 68 88 799 j=3: -29 -500 4 9 10 -4 23 68 88 799 j=4: -29 -500 4 9 10 -4 23 68 88 799 j=5: -29 -500 4 9 -4 10 23 68 88 799 i=6: j=1: -500 -29 4 9 -4 10 23 68 88 799 j=2: -500 -29 4 9 -4 10 23 68 88 799 j=3: -500 -29 4 9 -4 10 23 68 88 799 j=4: -500 -29 4 -4 9 10 23 68 88 799 i=7: j=1: -500 -29 4 -4 9 10 23 68 88 799 j=2: -500 -29 4 -4 9 10 23 68 88 799 j=3: -500 -29 -4 4 9 10 23 68 88 799 i=8: j=1: -500 -29 -4 4 9 10 23 68 88 799 j=2: -500 -29 -4 4 9 10 23 68 88 799 i=9: j=1: -500 -29 -4 4 9 10 23 68 88 799 =========================================================================★ 可见对于该组数据实际上在i=7, j=3 时已经得到最终结果。

评论