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

    你可能感兴趣的文章
    PHP数据访问的多重查询(租房子查询)
    查看>>
    RabbitMQ - 如保证消息的可靠性?(消息确认、消息持久化、失败重试机制)
    查看>>
    RabbitMQ - 基于 SpringAMQP 带你实现五种消息队列模型
    查看>>
    php数组函数分析--array_column
    查看>>
    php数组去重复数据的小例子
    查看>>
    php数组实现:哈希 +双向链表
    查看>>
    PHP数组排序函数array_multisort()函数详解(二)
    查看>>
    php数组的几个函数和超全局变量
    查看>>
    PHP文件上传详解
    查看>>
    PHP文件锁
    查看>>
    php文本框输入制定文本,php – 当用户没有向文本框输入任何内容时...
    查看>>
    PHP时间戳和日期相互转换操作总结
    查看>>
    php时间戳知识点,php 时间戳函数总结与示例
    查看>>
    php更新数据库失败,php – 无法更新MySQL数据库
    查看>>
    php机器人聊天对话框,基于AIML的PHP聊天机器人
    查看>>
    PHP查找数组中最大值与最小值
    查看>>
    php查最大值,在PHP数组中查找最大值
    查看>>
    php标签筛选,关于PHP CodeIgniter框架中通过<a>标签和url做多条件分类筛选
    查看>>
    php根据年月日计算年龄
    查看>>
    RabbitMQ - 单机部署(超详细)
    查看>>