zoukankan      html  css  js  c++  java
  • 算法入门(一)排序之冒泡排序

    基本思想

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

    动态冒泡排序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 年 图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实 之外,似乎没有什么值得推荐的。”

  • 相关阅读:
    PPT1 例1
    皇宫看守 树形DP
    没有上司的晚会 树形DP
    将功补过 树形DP
    战略游戏 树形DP
    选课 树形DP
    二叉苹果树 树形DP
    GDOI2016总结
    加分二叉树 树形DP
    [注意]未做的题(最短路)
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181232.html
Copyright © 2011-2022 走看看