面试时这样介绍算法,想不高薪都难,排序算法(冒泡排序)

2023-11-15

算法背景

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序是稳定的排序算法,它的时间复杂度为O(n^2)。它是一种较慢的排序算法,在某些情况下不如其他排序算法高效,但它的实现简单,易于理解。在计算机科学中,冒泡排序被认为是一种教学算法,用于教授基本的排序算法思想。

算法流程

冒泡排序算法的流程如下:

从数组的第一个元素开始,比较相邻的两个元素,如果第一个比第二个大,就交换他们的位置。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

注意,第一步只需要扫描一遍数组,第二步需要扫描n-1遍,第三步需要扫描n-2遍,以此类推。

时间和空间复杂度

冒泡排序的时间复杂度是 O(n^2),空间复杂度是 O(1)。

其中,时间复杂度说明了算法执行所需要的时间随数据规模增长而增长的速度。在冒泡排序中,通过两重循环,需要对每个元素都进行n-1次比较,所以总共需要进行n(n-1)/2次比较,所以时间复杂度为O(n^2)。

空间复杂度说明了算法所需要的存储空间随数据规模增长而增长的速度。冒泡排序是在原数组上进行排序的,不需要额外的存储空间,所以空间复杂度为 O(1)。

需要注意,在实际应用中,如果数组已经有序或者基本有序,冒泡排序会更快,因为会提前结束循环。

冒泡排序的优缺点

冒泡排序的优点:

  • 算法简单易懂,容易实现。

  • 稳定排序,不改变相同元素的相对顺序。

冒泡排序的缺点:

  • 时间复杂度为O(n^2),不适合大规模数据的排序。

  • 效率低下,如果数组已经有序或者基本有序,冒泡排序会更快,因为会提前结束循环。

因此,冒泡排序适用于小数据量或者对稳定性要求较高的场景,但不适用于大数据量或高效率要求的场景。

示例代码

python

#include <iostream>
using namespace std;

void merge(int arr[], int left, int mid, int right) {
    // 计算两个子序列的长度
    int n1 = mid - left + 1;
    int n2 = right - mid;

    // 创建两个辅助数组
    int L[n1], R[n2];

    // 拷贝数据到辅助数组
    for (int i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (int i = 0; i < n2; i++) {
        R[i] = arr[mid + 1 + i];
    }

    // 合并两个子序列
    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k++] = L[i++];
        } else {
            arr[k++] = R[j++];
        }
    }

    // 拷贝剩余元素
    while (i < n1) {
        arr[k++] = L[i++];
    }
    while (j < n2) {
        arr[k++] = R[j++];
    }
}

void mergeSort(int arr[], int left, int right) {
    if (left < right) {
        // 找到中间位置
        int mid = (left + right) / 2;

        // 递归排序左半部分
        mergeSort(arr, left, mid);

        // 递归排序右半部分
        mergeSort(arr, mid + 1, right);

        // 合并两个子序列
        merge(arr, left, mid, right);
    }
}

int main() {
    int arr[] = {5, 2, 9, 1, 7, 6, 8, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);

    mergeSort(arr, 0, n - 1);

    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

详细注释:

  • n = len(arr):获取数组长度。

  • for i in range(n):外层循环控制着冒泡排序的趟数。

  • for j in range(0, n-i-1):内层循环控制着每趟排序中相邻元素的比较和交换。

  • if arr[j] > arr[j+1]:如果相邻元素顺序不对,交换两元素。

  • return arr:返回排序后的数组。

适用场景

冒泡排序是一种简单易懂且稳定的排序算法,适用于数据规模不大的排序场景。由于冒泡排序的时间复杂度为 O(n^2),对于大数据集来说,会有明显的性能问题。因此,冒泡排序更适用于数据规模较小的排序场景。

另外,冒泡排序具有稳定性,即相同元素之间的相对位置不变,这在某些场景中非常重要。例如,如果要对一个学生成绩列表进行排序,并且学生成绩相同时需要保持学生姓名的顺序,那么冒泡排序就是一个很好的选择。

总之,冒泡排序适用于数据规模较小且需要稳定性的排序场景。

正面例子

对于一个学生成绩列表进行排序。需要按照学生的总分进行排序,并且如果总分相同,需要按照学生姓名的字母顺序进行排序。这个场景中,冒泡排序是一个很好的选择,因为冒泡排序具有稳定性,可以保证相同总分的学生姓名的顺序

反面例子

对于一个高性能期货交易系统,需要对亿级别的交易记录进行排序。在这个场景中,冒泡排序明显不能满足性能要求,因为冒泡排序的时间复杂度为O(n^2),对于大规模数据集来说会有明显的性能问题。应该使用其他算法如快速排序,归并排序等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试时这样介绍算法,想不高薪都难,排序算法(冒泡排序) 的相关文章

随机推荐

  • 邻接表图,增加、删除、修改,功能齐全,有双权和有单权

    刚刚考完 纪念一下 虽说不是考试提交的最终代码 但是是我提前准备的考试源码 供给考试使用 这是单权 下面是双权的 include
  • linux jobs命令

    原文链接 http blog 163 com a7701 126 blog static 20821732201276231717 fg bg jobs ctrl z都是跟系统任务有关的 虽然现在基本上不怎么需要用到这些命令 但学会了也是很
  • AtCoder Beginner Contest 313

    A To Be Saikyo atcoder jp AC代码 include
  • Android EventBus收不到消息事件?又给自己挖坑了吧

    骚年 老给自己挖坑 该扇嘴巴子了 检查一下看是不是以下几种情况 没有register事件 事件类没对上号 比如导错包 接收事件的方法不是public 事件被优先级更高的拦截且中断了
  • 怎么将webm文件转换成MP4格式在手机上播放

    由于各品 不同型号的手机配置不同 手机支持的视频格式也可能不同 比较常见的就是视频格式转换 即将手机不支持播放的格式视频转换成手机支持的格式视频 手机最常用的格式是MP4 3GP 3G2等格式 所以我们只需将在电脑上下载的视频转换成这些适合
  • 想用Python做副业?看这一篇就够了

    大家好 我是耿直 随着人工智能 大数据 物联网的广泛应用 与之紧密关联的Python技术开始受到人们的极大关注 各行业对Python技术服务的需求量呈指数级暴增 尤以爬虫技术服务为甚 供不应求早已成为常态 而近两年受到各种不可抗力的影响 做
  • Linux(Centos7) 运行脚本程序,终端只返回 “已杀死”

    最近在实验室服务器上跑代码 没跑多久就显示 已杀死 而且只显示已杀死 没有任何其他打印和日志 1 确定不是代码的bug 2 网上搜了一大堆 全说是OOM的问题 就是代码消耗内存太多 被OOM killer杀死 但是我用的服务器内存确定充足
  • 百度地图marker点击切换icon以及上一个icon恢复原样

    var preMarker this map addEventListener click function e console log e if e overlay e overlay toString object Marker var
  • openresty+lua安装

    一 下载软件 下载ngx openresty xxx tar gz并解压 wget https openresty org download ngx openresty 1 9 7 1 tar gz ngx openresty xxx bu
  • 将包含children的数据解析构成iview的cascader或者树行需要的结构

    function convertTree rst const result 遍历 tree rst forEach item gt 解构赋值 let value value label label children children ite
  • 使用VS Code开发Arduino

    文章目录 目的 软件安装 快速使用 更多说明 编译输出时中文乱码 Arduino扩展配置说明 使用 arduino cli 总结 目的 Arduino官方的IDE作为编辑器的功能挺简陋的 用起来并不是很舒服 相比较之下用VS Code Vi
  • 面试官:说说TCP如何实现可靠传输

    今天来讲一下TCP是如何保证可靠传输的 这也是面试常问的一个题目 这个问题不单止能看出你是否真的了解TCP原理 更看出你是否有一个总结的能力 我们从三个部分来讲TCP是如何实现可靠传输的 滑动窗口 首先是讲TCP中的滑动窗口 它和TCP的可
  • 论文阅读: GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose(CVPR2018)

    CVPR2018 GeoNet Unsupervised Learning of Dense Depth Optical Flow and Camera Pose 提出了一个联合估计深度 光流和pose的网络 这是在left right c
  • Javascript设计模式-04-工厂模式

    Javascript设计模式 04 工厂模式 简单工厂 抽象工厂 简介 工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类 该模式使一个类的实例化延迟到了子类 而子类可以重写接口方法以便创建的时候指定自己的对象类型 个人理
  • webview跳转第三方APP

    hello 又是我鑫鑫 前言 这吃给大家带来的博客是关于webview跳转第三方APP的 相信这个问题也为难过各位 那么话不多说 我直接上代码 MainActivity java 这里的活动名我没有改 使用的话 将所有的Contact Cu
  • C规范编辑笔记(十三)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 C规范编辑笔记 十一 C规范编
  • 线性表技巧之Note001-链表的最后一个节点

    找到单链表的尾节点 通常我们遍历单链表的代码如下 list 指向单链表的头节点 因此 list gt next 指向链表的第一个节点 LNode node list gt next while node NULL node node gt
  • Qt项目环境构建

    工欲善其事必先利其器 使用Qt来进行开发 得先配置好一个合适的环境 下面是我关于Qt项目环境构建的一些小结 Qt的项目构建主要依赖 pro文件 和 pri文件 include包含文件 提供pro的复用性高的东西给多个项目包含 所以新建一个Q
  • mysql query 查询_mysql提供了explain query_sql进行查询分析

    mysql提供了explain query sql进行查询分析 下边是一些参数说明 ID Query Optimizer 所选定的执行计划中查询的序列号 Select type 所使用的查询类型 主要有以下这几种查询类型 DEPENDENT
  • 面试时这样介绍算法,想不高薪都难,排序算法(冒泡排序)

    算法背景 冒泡排序是一种简单的排序算法 它重复地遍历要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 遍历数列的工作是重复地进行直到没有再需要交换 也就是该数列已经排序完成 这个算法的名字由来是因为越大的元素会经由交换慢慢