用冒泡排序法对任意输入的 10 个数按照从小到大的顺序进行排序。
算法描述:
冒泡排序是一种较为简单的排序算法,其基本思想为从头开始依次比较相邻的两个元素大小,将较大(较小)的元素移至右端,最终使最大(最小)的元素移至序列最后,再次重复上述过程,直到最终序列完全有序为止。
算法执行过程分析:
例如:有一行数分别是26、10,83,56,28,66,7
说明:按照从小到大的顺序进行排序,方框数为比较的次数,以下图示为比较完交换的结果。
(1)第一躺排序:
此时已将此行数中最大的那个数字放在末尾。
(2)第二躺排序:
此时将倒数第二大的数字放在后面。
(3)第三趟排序:
此时将倒数第三大的数字放在后面。
以此类推,可以得到最终结果为:7、10、26、28、56、66、83。
备注:n个数要比较n - 1趟,第一躺比较n - 1次,第 j 趟需要比较n - j 次。
实现过程:
(1) 通过两个 for 循环实现冒泡排序的全过程,外层 for 循环决定冒泡排序的趟数,内层 for 循环决定每趟所进行两两比较的次数。
(2) 程序代码如下:
#include <stdio.h>
int main(void) {
int i, j, tmp, a[10]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for (int i = 0; i < 10; ++i) {
scanf("%d", &a[i]);//从键盘中输入10个数
}
for (i = 1; i < 10; ++i) { //变量i代表比较的趟数
for (j = 0; j < 10 - i; ++j) { //变最j代表每趟两两比较的次数
if (a[j] > a[j + 1]) {
tmp = a[j]; //产利用中间变童实现两值互换
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
printf("排序后的顺序是:\n");
for (i = 0; i < 10; i++)
printf("%5d", a[i]); //将冒泡排序后的顺序输出
return 0;
}
输出结果:
请输入10个数:
1 20 5 6 4 80 30 15 201 90
排序后的顺序是:
1 4 5 6 15 20 30 80 90 201
改进版冒泡排序:
#include <stdio.h>
int main(void) {
//改进版冒泡排序
int x, y, flag, tmp1, b[10];
printf("请输入10个数:\n");
for (int x = 0; x < 10; ++x) {
scanf("%d", &b[x]);//从键盘中输入10个数
}
for (x = 1; x < 10; ++x) {
flag = 0; //假设第x行没有交换数据,flag=0
for (y = 0; y < 10 - x; ++y) {
if (b[y] > b[y + 1]) {
tmp1 = b[y];
b[y] = b[y + 1];
b[y + 1] = tmp1;
flag = 1; //交换数据,flag=1
}
}
if (0 == flag) { //若flag=0,表明第x行没有交换数据
break;
}
}
printf("排序后的顺序是:\n");
for (x = 0; x < 10; x++) {
printf("%5d", b[x]); //将冒泡排序后的顺序输出
}
return 0;
}
输出结果:
请输入10个数:
1 20 5 6 4 80 30 15 201 90
排序后的顺序是:
1 4 5 6 15 20 30 80 90 201
技术要点:
本实例要求用冒泡法对 10 个数由小到大进行排序,冒泡法的基本思路是,如果要对 n 个数进行冒泡排序,那么要进行 n-1 趟比较,在第 1 趟比较中要进行 n-j 次两两比较,在第 j 趟比较中要进行 n-j 次两两比较。从这个基本思路中就会发现,趟数决定了两两比较的次数,这样就很容易将两个 for 循环联系起来了。