排序算法之时间复杂度O(n2)
排序算法是一个比较基础的问题,这里选择六个基础的排序算法进行介绍。从时间复杂度来进行介绍,其中选择排序,插入排序和冒泡排序的时间复杂度是O(n2)O(n^2)O(n2)。堆排序,合并排序和快速排序的时间复杂度是O(nlog2n)O(nlog_{2}^{n})O(nlog2n),这块内容会在下一个博客中介绍。
由于算法比较好理解,这里提供C++代码和简单的算法介绍。实力推荐一个手机APP动态展示算法,非常适合入门学习,上下班随时随地学习!
算法动态图解:链接:https://pan.baidu.com/s/1mX3s7VjLTKLr7MZhAQO-6Q
提取码:cv5y
选择排序
选择排序就是从重复“从待排序的序列数据中选出最小值”,将其与待排序序列的最左边的数字进行交换。在待排序的序列中选择出最小值采用的是线性查找。
void ChooseSort()
{int list[10] = { 6,3,4,8,9,1,2,3,5,9 };int len = 10;int min_index = 0;int temp;for (size_t i = 0; i < len; i++){min_index = i;for (size_t j = i; j < len-1; j++){if (list[min_index] > list[j + 1]){min_index = j + 1;}}//将最小值放到最左侧temp = list[i];list[i] = list[min_index];list[min_index] = temp;}for (int i = 0; i <len; i++){cout << list[i]<<",";}cout << endl;
}
因为选择排序中使用了线性查找来寻找最小值,因此在第一轮的时候需要比较n-1个数字。第二轮需要n-2个数字…到n-1时只需要比较1个数字。比较次数总共为(n-1)+(n-2)+…+1≈\approx≈n22\frac{n^2}{2}2n2,时间复杂度O(n2)O(n^2)O(n2)
冒泡排序
顾名思义,如同算法的名称一样。我们每一轮都将该待排序的序列中最大的数字放到待排序数组的最右侧。从数组的左侧开始依次比较相邻的两个数字,如果左侧的数字比右侧大则进行交换。
void BubbleSort()
{int list[10] = { 6,3,4,8,9,1,2,3,5,9 };int len = 10;int temp;for (size_t i = 0; i < len-1; i++)//n个元素需要比较n-1次(n-1趟){//每一趟都会选择一个最大值放到数组右侧,已经排序好的不需要再检索for (size_t j = 0; j < len-i-1; j++){if (list[j] > list[j + 1]){//交换temp = list[j];list[j] = list[j+1];list[j+1] = temp;}}}for (int i = 0; i < len; i++){cout << list[i] << ",";}cout << endl;
}
每一轮都要进行一次线性比较,所以总的比较次数与选择排序一致。(n-1)+(n-2)+…+1≈\approx≈n22\frac{n^2}{2}2n2,时间复杂度O(n2)O(n^2)O(n2)
插入排序
不断的从数组的未排序区域中取出元素,与左侧已归位的数字进行比较。若左侧数字更大,则进行交换。重复该操作,直到左边已归位的的数字比取出的数字更小,或者取出的数字已经移到整个序列的最左边为止。
- 第一轮操作时,默认数组第一个元素已经排序完成。
void InsertSort()
{int list[10] = { 6,3,4,8,9,1,2,3,5,9 };int len = 10;int temp;for (size_t i = 1; i < len; i++){//将右侧待排序的第一个元素与左侧排序好的元素依次进行比较,限制j>0取到序列的最左侧for (size_t j = i; j > 0; j--){if (list[j] < list[j - 1]){temp = list[j];list[j] = list[j - 1];list[j - 1] = temp;}}}for (int i = 0; i < len; i++){cout << list[i] << ",";}cout << endl;
}
这里的时间复杂度按照最糟糕的情况计算,如果取出来的数字比左边已归位的数字都要小。那第2轮要比较1次,第3轮比较2次…最后一轮比较n-1次。所以总的比较次数为(n-1)+(n-2)+…+1≈\approx≈n22\frac{n^2}{2}2n2,时间复杂度O(n2)O(n^2)O(n2)
附部分APP截图
不是推广APP,是真的很好用(笑哭)。APP链接有问题联系QQ:1678354579
以上代码全部手敲,经过完整测试无误;
排序算法之时间复杂度O(n2)相关推荐
- 常用的排序算法的时间复杂度和空间复杂度
常用的排序算法的时间复杂度和空间复杂度 1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...
- vant coupon 时间戳如何计算_计软考研双日练 | 如何计算拓扑排序算法的时间复杂度?...
☝☝☝ 软件工程考研独家平台 撰稿 | 康康哥 编辑 | 丽丽姐 本文由懂计算机.软件工程的博士师哥原创 双日练:NO.20200610 若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间 ...
- 常用的排序算法的时间复杂度和空间复杂度 .
常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 ...
- 各种排序算法的时间复杂度
时间复杂度 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,在算法分析时,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度 ...
- 各种常用排序算法的时间复杂度和空间复杂度
https://blog.csdn.net/jiajing_guo/article/details/69388331 一.常用排序算法的时间复杂度和空间复杂度表格 二.特点 1.归并排序: (1)n大 ...
- 【计算机基础】 经常使用的排序算法的时间复杂度和空间复杂度
经常使用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 高速排序 O(n2) O(n*log2n) 不稳 ...
- c语言验证完成排序算法的时间,排序算法的时间复杂度和空间复杂度
常用的内部排序方法有:交换排序(冒泡排序.快速排序).选择排序(简单选择排序.堆排序).插入排序(直接插入排序.希尔排序).归并排序.基数排序(一关键字.多关键字). 一.冒泡排序: 1.基本思想: ...
- 各个排序算法及其时间复杂度
各个排序算法及其时间复杂度 一.内部排序: 1.稳定的排序算法 1.1 冒泡排序 1.1.1 冒泡排序流程 1.1.2 冒泡排序的实现 1.2 插入排序 1.2.1 插入排序流程 1.2.2 插入排序 ...
- 各种排序算法的时间复杂度对比
各种排序算法的时间复杂度对比 排序算法 最坏时间复杂度 平均时间复杂度 最优时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) O(n^2) O(n) O(1) 稳定 插入排序 O(n^2) O( ...
- 各个排序算法的时间复杂度、稳定性、快排的原理以及图解
目录 一.数据结构的八大排序算法总结笔记: 1.常见的数据结构排序算法如下图所示: 2.常见数据结构排序算法的时间复杂度.空间复杂度.稳定性介绍如下图所示: 二.排序算法逐一介绍: 1.直接插入排序: ...
最新文章
- word2vec 中的数学原理详解
- 死磕Java并发:J.U.C之并发工具类:CountDownLatch
- centos mysql5.7主从同步配置_centos7搭建mysql5.7主从同步
- python基础学习[python编程从入门到实践读书笔记(连载四)]:数据可视化项目第15章
- 「Codeforces」598E (区间dp)
- Android之back键拦截处理
- iptables说明(转)
- 数据结构与算法——二叉树与图汇总整理
- LWIP_STM32_ENC28J60_NETCONN_TCP_CLIENT(4)
- 纯PHP实现定时器任务(Timer)
- github java开源项目经验_GitHub 上最火的开源项目 —— Java 篇
- undefined reference to错误的解决方法
- 哈工大密码学实验(CA证书认证系统)
- YUV420 总结 (YU12、YV12、NV12 和 NV21)
- ubuntu16.04安装google拼音输入法
- 关于求极限对几个问题的思考和总结
- Mtk touch panel驱动/TP驱动 详解
- 标准盒模型与怪异盒模型的区别
- Revit二次开发——引用dynamo中的几何库
- UEBA对抗威胁之“健康就是财富”!