#include#include #include int main(void) { int i, j, t; char a[10] = {4, 5, 3, 9, 1, 2, 0, 8, 6, 7}; system("color 0a"); for (i = 0; i < 9; i++) { for (j = i + 1; j < 10; j++) { if (a[i] > a[j]) { t = a[i]; a[i] = a[j]; a[j] = t; } } } for (i = 0; i < 10; i++) { printf("%d,", a[i]); } return 0; }
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
原:9 8 7 6 5 4 3 2 1 0
8 9 7 6 5 4 3 2 1 0
7 9 8 6 5 4 3 2 1 0
6 9 8 7 5 4 3 2 1 0
5 9 8 7 6 4 3 2 1 0
4 9 8 7 6 5 3 2 1 0
3 9 8 7 6 5 4 2 1 0
2 9 8 7 6 5 4 3 1 0
1 9 8 7 6 5 4 3 2 0
目:0 9 8 7 6 5 4 3 2 1
和冒泡排序法一样【冒泡法参见该篇基本算法——冒泡排序(c语言版)_Hsing Chin的博客-CSDN博客】这也是一个外循环。
在这个外循环里的内循环干的活就是a[0]不停地依次与a[m](m=1、2、3...9)交换元素。
for (i = 0; i < 9; i++),这个i的范围是如何确定的?
我们的目的是将
9 8 7 6 5 4 3 2 1 0 → 0 1 2 3 4 5 6 7 8 9
那么,也就是问外循环需要几次可以完成呢?
我们从第二次外循环来找找规律。
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
原:0 9 8 7 6 5 4 3 2 1
0 8 9 7 6 5 4 3 2 1
0 7 9 8 6 5 4 3 2 1
0 6 9 8 7 5 4 3 2 1
0 5 9 8 7 6 4 3 2 1
0 4 9 8 7 6 5 3 2 1
0 3 9 8 7 6 5 4 2 1
0 2 9 8 7 6 5 4 3 1
目:0 1 9 8 7 6 5 4 3 2
红0因为都比后面的小,所以它已经是排好的了,不用再问了。其实就是a[0]不用问了。
这个表整体就是一个内循环,而内循环干的活就是a[1]不停地与a[m](m=2、3、4...9)交换元素。
看到外循环的规律没?总共10元素,第一个外循环地效果是把0放在它应该在的地方,第二个外循环是把1排好了...
外1——0
外2——1
外3——2
...——...
外8——9
所以外循环需要9次,那么for (i = 0; i < 9; i++)就是这样来的,从0开始到8结束,正好9个
数。
然后讲一下内循环for (j = i + 1; j < 10; j++)是怎么确定的?
其实内外循环时联动的,就像两个齿轮一样,一个大齿轮带动一个小齿轮。
在第一个大循环中,i=0的,刚才也讲到了,此时内循环干的活就是a[0]不停地依次与a[m](m=1、2、3...9)交换元素。需要交换几次???数一下嘛,9次就可以达成一个小目标,即把0放到最小的位置。j是什么?是数组的下标,或者说元素的位置。一开始是a[0]和a[1]交换,正好此时i=0,用j=i+1表示,j就是1。因为j的初值就是从1开始的,所以就不能j<9了,这样就不是9次而是8次。



