#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main(void)
{
int i, j, t;
char a[10] = {9,8,7,6,5,4,3,2,1,0};
system("color 0a");
for (i = 0; i < 9; i++)
{
for (j = 0; j < 10-1-i; j++)
{
if (a[j] > a[j + 1])//冒泡排序的精髓就是相邻元素两两就交换,就是这一部分。
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d,", a[i]);
}
return 0;
}
char a[10] = {9,8,7,6,5,4,3,2,1,0};
这是最复杂的一种,最大的在第一个,最小的在最后一个,在这种情况下从小到大排列是最复杂的,其他的都没有这种情况复杂了,但我们是通法通则,从特殊到一般。
冒泡排序法的难点是两个循环(外循环和内循环),着重讲一下这两块。
for (i = 0; i < 9; i++) //这是外循环,外循环的作用是干嘛的呢?
9 8 7 6 5 4 3 2 1 0(原始) → 0 1 2 3 4 5 6 7 8 9(最终目的)
9 8 7 6 5 4 3 2 1 0(原始)→ 8 7 6 5 4 3 2 1 0 9(小目标)
0:8 9 7 6 5 4 3 2 1 0
1:8 7 9 6 5 4 3 2 1 0
2:8 7 6 9 5 4 3 2 1 0
3:8 7 6 5 9 4 3 2 1 0
4:8 7 6 5 4 9 3 2 1 0
5:8 7 6 5 4 3 9 2 1 0
6:8 7 6 5 4 3 2 9 1 0
7:8 7 6 5 4 3 2 1 9 0
8:8 7 6 5 4 3 2 1 0 9
冒泡排序的精髓就是相邻元素两两就交换,我们发现通过相邻元素比大小进行两两交换后,最大的9跑到最后一位,需要交换几次?9次即可,完成上述整个过程就是一个外循环(记作外1)!
好,按照这个规律,我们继续用冒泡排序法,进行第二个外循环(记作外2)。
8 7 6 5 4 3 2 1 0 9 → 7 6 5 4 3 2 1 0 8 9
0:7 8 6 5 4 3 2 1 0 9
1:7 6 8 5 4 3 2 1 0 9
2:7 6 5 8 4 3 2 1 0 9
3:7 6 5 4 8 3 2 1 0 9
4:7 6 5 4 3 8 2 1 0 9
5:7 6 5 4 3 2 8 1 0 9
6:7 6 5 4 3 2 1 8 0 9
7:7 6 5 4 3 2 1 0 8 9
我们发现,这次只需要8次,就能把整个序列中第二大的排到我们想要的目的(从小到打排列)它应该排的位置。
你也可以这样看,把9去掉,不看了。
0:7 8 6 5 4 3 2 1 0
1:7 6 8 5 4 3 2 1 0
2:7 6 5 8 4 3 2 1 0
3:7 6 5 4 8 3 2 1 0
4:7 6 5 4 3 8 2 1 0
5:7 6 5 4 3 2 8 1 0
6:7 6 5 4 3 2 1 8 0
7:7 6 5 4 3 2 1 0 8
下次,你可以把8和9都去掉,我们把关注点放在没有排好序的地方。
我们大胆猜测,当只剩下0和1没有排序的时候,是什么样的场景呢?
1 0 2 3 4 5 6 7 8 9 → 0 1 2 3 4 5 6 7 8 9
0:0 1 2 3 4 5 6 7 8 9 此时就已经达到我们的最终目标了,可以终止我们的循环了。
把9挪到最后位置,当时我们记作外1,把8挪到倒数第二个位置我们记作外2。
找规律!!!
9——外1
8——外2
7——外3
6——外4
5——外5
4——外6
3——外7
2——外8
1——外9(此时排序已经完成了,即从小到大排序)
看到没外循环只要9次就over了。所以for (i = 0; i < 9; i++)中i<9(0~8,正好for循环9次嘛)。
其实,刚才讲的外循环是包含内循环的,但是难点没有讲。
for (j = 0; j < 10-1-i; j++)//这是内循环,主要是这块不太好理解,尤其是j的取值范围是如何确定的呢?
当我们开始第一个外循环时,我们的目的是把9从第一个位置放到最后一个位置,但是实际的操作是内循环干的活。
首先我们要搞清楚,i和是什么,i是外循环的次数,j是数组的下标表示数组中哪个元素。i和j要扯上关系,主要是在这个点!我们之前提到的,已经排好顺序的元素我们是不用管了的。这导致我们需要交换的次数一次比一次少,减到i,其实就是减掉不用问的那些元素。另外我们发现,总共10个元素,有一个元素是不需要排的(如上面当1排列好之后,0就自动在他应该在的位置了),所以要减1。