博客
关于我
排序算法——O(n^2)(冒泡排序、选择排序、插入排序)
阅读量:532 次
发布时间:2019-03-08

本文共 2768 字,大约阅读时间需要 9 分钟。

冒泡排序、选择排序、插入排序


冒泡排序(BubbleSort)

冒泡排序是一种简单但效率较低的排序算法,通过多次对相邻元素进行比较和交换,最终将数组按升序排序。

工作原理

步骤如下:

  • 冒泡排序每次通过一趟左向右扫描来完成一次冒泡。
  • 在每一趟中,最大值会“冒”到数组的最后一位。
  • 重复这个过程,直到没有比前一趟更大的元素被交到最后位置。
  • 这意味着,每次经过一趟扫描,你都会找到当前数组中的最大值,并逐步将数组整理有序。

    代码示例

    #include 
    #include
    using namespace std;void BubbleSort(vector
    &arr) { int n = arr.size(); if (n < 2) { return; } for (int i = 0; i < n; ++i) { bool changed = false; for (int j = 0; j < n - i - 1; ++j) { if (arr[j] > arr[j+1]) { // 交换相邻元素 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; changed = true; } } if (!changed) break; }}int main() { vector
    arr = {9, 8, 7, 5, 7, 3, 4, 1}; BubbleSort(arr); for (int i : arr) { cout << i << " "; } cout << endl; return 0;}

    运行结果:

    冒泡排序后的数组为:1 3 4 5 7 7 8 9

    选择排序(SelectionSort)

    选择排序通过每次找出当前未排序区间内的最小值,将其交换到目标位置,最终完成排序。

    工作原理

    步骤如下:

  • 初始化两个指针:K 指向数组的第一个位置,min 指向 K 以后的位置。
  • 从 K+1 开始,遍历数组,找到最小的元素。
  • 将 min 元素与 K 位置的元素交换。
  • 重复步骤1,直到整个数组排序完成。
  • 代码示例

    #include 
    #include
    using namespace std;void DataSwap(int &data1, int &data2) { int temp = data1; data1 = data2; data2 = temp;}void SelectionSort(vector
    &arr) { int n = arr.size(); if (n < 2) { return; } for (int i = 0; i < n - 1; ++i) { int min_index = i; for (int j = i + 1; j < n; ++j) { if (arr[j] < arr[min_index]) { min_index = j; } } if (min_index != i) { DataSwap(arr[min_index], arr[i]); } }}int main() { vector
    arr = {9, 8, 7, 5, 7, 3, 4, 1}; SelectionSort(arr); for (int i : arr) { cout << i << " "; } cout << endl; return 0;}

    运行结果:

    选择排序后的数组为:1 3 4 5 7 7 8 9

    插入排序(InsertionSort)

    插入排序通过将每个元素插入到其适当的位置,逐步生成一个有序的数组。

    工作原理

    步骤如下:

  • 从数组的第二个元素开始,每个元素都逐步插入到正确位置。
  • 对于每个插入的元素,比较并找到正确的位置,将它插入,同时将之后的元素右移。
  • 重复直到所有元素插入完成。
  • 由于插入操作的性质,插入排序的效率较高,特别适用于有局部有序的情况。

    代码示例

    #include 
    #include
    using namespace std;void InsertionSort(vector
    &arr) { int n = arr.size(); if (n < 2) { return; } for (int i = 1; i < n; ++i) { int tmp = arr[i]; int j = i - 1; while (j >= 0 && tmp < arr[j]) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = tmp; }}int main() { vector
    arr = {9, 8, 7, 5, 7, 3, 4, 1}; InsertionSort(arr); for (int i : arr) { cout << i << " "; } cout << endl; return 0;}

    运行结果:

    插入排序后的数组为:1 3 4 5 7 7 8 9

    总结

    这三种排序算法各有优缺点:

    • 冒泡排序:简单易懂,但效率较低。
    • 选择排序:逐步完善,但几次比较可能较多。
    • 插入排序:适合有局部有序的情况,效率较高。

    根据具体需求选择合适的排序方法,能优化算法性能。

    转载地址:http://ctuiz.baihongyu.com/

    你可能感兴趣的文章
    Python 实现定时任务的八种方案!
    查看>>
    Python 实现自动化测试 dubbo 协议接口
    查看>>
    python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
    查看>>
    Python 对mysql数据库的操作
    查看>>
    Python 对象数据库列表
    查看>>
    Python 导入requests报错No module named requests
    查看>>
    python 将函数加到列表中进行调用
    查看>>
    python 将图片与字符串相互转换
    查看>>
    Python 嵌套字典全面指南
    查看>>
    Python 常见的错误类型和继承关系
    查看>>
    python 常量_零基础学Python系列之一:Python的变量与常量
    查看>>
    Python 并发编程
    查看>>
    python 序列化操作
    查看>>
    Python 开发者,这 7 个 VS Code 插件极力推荐
    查看>>
    python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
    查看>>
    python 录音左右声道_Python分离立体声wav压缩文件的左右声道
    查看>>
    Python 循环异或对文件进行加解密
    查看>>
    Python开发环境搭建(附VMware安装包及虚拟机环境)
    查看>>
    python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
    查看>>
    Python 快速下载依赖
    查看>>