算法入门(一)排序之冒泡排序

基本思想

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

动态冒泡排序https://visualgo.net/zh/sorting

由于冒泡排序可能是大家接触最多的排序算法,这里我们不在过多描述。

代码演示

#include "stdio.h"
int main()
{
    //定义一个容量为100数组用来存放输入的数据
    int arr[100];
    int i, j, k, n;
    //获取n的值,确定输入n个数据
    scanf("%d", &n);
    //获取控制台输入的n个数据并储存到数组arr中
    for (i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
    }
    //冒泡排序核心(两层for循环,一层判断趟数,一层判断比较个数)
    for (i = 1; i <= n - 1; i++) {   //n个数,需要进行 n - 1 趟
        for (j = 1; j <= n - i; j++) {   //从第一个数开始比较直到最后一个尚未归位的数
            if (arr[j] > arr[j+1]){
                //比较大小并交换位置
                int temp;
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    //打印结果
    for (i = 1; i <= n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

输入:

输出:

分析

如果有 n 个数进行排序,只需将 n-1 个数归位,也就是说要进行 n-1 趟操作。而“每一趟”都需要从第 1 位开始进行相邻两个数的比较,将较小的一个数放 在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一 个尚未归位的数,已经归位的数则无需再进行比较。

冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是 O(N^2)。这是 一个非常高的时间复杂度。

假如我们的计算机每秒钟可以运行 10 亿次,那么对 1 亿个数进行排序,桶排序只需要 0.1 秒,而冒 泡排序则需要 1 千万秒,达到 115 天之久。

Donald E. Knuth(中文名为高德纳,1974 年 图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实 之外,似乎没有什么值得推荐的。”

posted on 2020-07-12 18:16  青山是谁  阅读(27)  评论(0编辑  收藏  举报