博客
关于我
排序算法——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/

    你可能感兴趣的文章
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>
    mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
    查看>>
    mysql 导入导出大文件
    查看>>
    MySQL 导出数据
    查看>>
    mysql 将null转代为0
    查看>>
    mysql 常用
    查看>>
    MySQL 常用列类型
    查看>>
    mysql 常用命令
    查看>>
    Mysql 常见ALTER TABLE操作
    查看>>
    MySQL 常见的 9 种优化方法
    查看>>