思路:对于一个数组,我们想对它进行排序,其实只要将相邻的两个数进行比较,把小的放前面就好了。
比如:如果有4个数(1, 8,5,2)。
1.第一次比较前两个数(1,8)的大小,把位置发现不需要交换,第二次比较在后面两个数(8,5)的大小,交换后是(5,8),再之后对(8,2)交换得到(2,8),所以进行了三次比较得到(1,5, 2,8);最大的数8已经到最后了,后面的2也上浮了一个位置,就像水中的气泡一样,所以叫冒泡排序法。
这时候发现还没完全排好。但是我们已经发现最大的数8已经在最后,所以我们只要对前面的三个数进行排序就好。
2.所以第一次比较1,5,发现不用交换,第二次比较5,2,交换后是2,5。最后成为(1,2,5,8)。所以我们用了两次把这三个数排好了。
3.本例很是巧合,前两个数1和2我们很清楚知道不用比较。事实上在不知道的情况下我们需要对他们进行比较一次,才能最终确定这4个数的顺序。
小结一下:
四个数我们用了3步完成排序,第一步进行了3次比较,第二步进行了2次比较,第三步进行了1次比较。
也就是假设n个数,那么就要进行n-1 步,第i 步中则需要n-i 次比较。
所以我们的程序就出来了(以10个数的排序为例):
#include <iostream>
#include <string>
using namespace std;
int main() {
int n[10];
int i, j;
int temp; //用于缓存需要交换的数字
cout << "请输入十个数字!" << endl;
for (i = 0; i < 10; i++) {
cin >> n[i];
}
for (i = 0; i < 9;i++) { //共进行9步
for (j = 0; j < 9 - i;j++) { //在每一步进行10-i次两两比较
if (n[j] > n[j + 1]) {
temp = n[j];
n[j] = n[j + 1];
n[j + 1] = temp;
}
}
}
cout << "排序后的数据是:" << endl;
for (i = 0; i < 10; i++)
{
cout << n[i] << ' ';
}
cout << endl;
system("pause");
return 0;
}
需要注意的点是:在内层循环中应该进行10-i 次比较,但是我们实际上我们的i 是从0开始的,但是我们之前的分析中i 的实际意义是步数,也就是从1开始的,所以我们在循环中是10-i-1=9-i 次。