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

    你可能感兴趣的文章
    NIO同步网络编程
    查看>>
    NIO基于UDP协议的网络编程
    查看>>
    NIO笔记---上
    查看>>
    NIO蔚来 面试——IP地址你了解多少?
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NISP国家信息安全水平考试,收藏这一篇就够了
    查看>>
    NIS服务器的配置过程
    查看>>
    NIS认证管理域中的用户
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP、CV 很难入门?IBM 数据科学家带你梳理
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>