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

本文共 2851 字,大约阅读时间需要 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 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>
    MySQL 添加索引,删除索引及其用法
    查看>>
    mysql 状态检查,备份,修复
    查看>>
    MySQL 用 limit 为什么会影响性能?
    查看>>
    MySQL 用 limit 为什么会影响性能?有什么优化方案?
    查看>>
    MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
    查看>>
    mysql 用户管理和权限设置
    查看>>
    MySQL 的 varchar 水真的太深了!
    查看>>
    mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
    查看>>
    MySQL 的instr函数
    查看>>
    MySQL 的mysql_secure_installation安全脚本执行过程介绍
    查看>>
    MySQL 的Rename Table语句
    查看>>