用冒泡排序法对任意输入的 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 循环联系起来了。