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


    基本思想

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

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

  • 相关阅读:
    325日报
    323日报
    Http请求种类
    http1.1和1.0的区别
    Java EE常用名词
    USEA、HASA、ISA
    基本类型及其封装类型的 == 和 equals()
    AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)
    B树和B+树
    DNS的寻址过程
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181232.html
Copyright © 2020-2023  润新知