| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【JavaSE|数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序 -> 正文阅读 |
|
[数据结构与算法]【JavaSE|数据结构】排序算法之冒泡排序,选择排序,插入排序与希尔排序 |
??前面的话?? 本篇文章带大家认识排序算法——冒泡排序,选择排序,插入排序与希尔排序,其中冒泡排序,选择排序,插入排序是基础的排序算法,希尔排序是插入排序的优化,四种排序算法全部都是基于比较的排序算法,本文将以图解动图的方式描述算法实现过程,实现代码为java。
📌导航小助手📌题外话:排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,排序算法是面试当中高频的考点,并且许多题都有用到排序算法的思路。 1.排序1.1排序排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。一般情况下(包括后文),如果提到排序,通常指的是排升序(非降序)。通常意义上的排序,都是指的原地排序(in place sort)。 1.2排序的稳定性两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序算法。 基于比较的常见排序算法有:冒泡排序,选择排序,插入排序,折半插入排序,希尔排序,堆排序,归并排序,快速排序等;基于非比较的常见排序算法有:计数排序,基数排序,桶排序等。 2.冒泡排序2.1排序算法从第二个元素开始,将该元素与前一个元素比较,如果前一个元素比较大,则交换。直到最后一个元素为最大元素,这一过程称为一趟冒泡排序。每进行一趟冒泡排序,缩小一次右侧区间,因为每进行一趟冒泡排序就有一个元素“归位”。
根据上述基本思路我们可以得到冒泡排序的代码:
但是会有一个问题,那就是如果数组已经有序了呢?这时候不需要再进行冒泡排序了,所以我们可以进行一点点优化,基本思路就是当遇到一趟排序时并没有发生元素交换,这时候就说明数组已经有序了,下一趟就不用排了,所以在交换过程中加上一个“标记”,这样就可以根据这个标记来确定后续是否需要继续冒泡排序。
2.2性能分析
最好情况:数组有序,时间复杂度O(N)。 3.选择排序3.1排序算法选择排序的思路很简单,从 动图演示:
3.2性能分析
4.插入排序4.1直接插入排序4.1.1排序算法从第二个元素开始,不妨将这个元素的下标设为 直接插入排序实现代码:
4.1.2性能分析
最好情况:数组有序,O(N)。直接插入排序有一个特点,越趋于有序,排序速度越快,根据此特点对数组进行分组多次直接插入排序,能够大大提高排序的效率,这种方法也就是后面的希尔排序。 4.2希尔排序4.2.1排序算法希尔排序(Shell’s Sort)又称"缩小增量排序"(Diminishing Increment Sort),它也是一种属插入排序类的方法,但在时间效率上较前述几种排序方法有较大的改进。 举个例子,有1万个数据需要排序,直接插入排序的时间复杂度高达1亿,如果每次排100个数分100组,它所需时间复杂度为100100100等于100万,由于每次直接插入排序后,数据会越来越趋于有序,所以最终的时间复杂度肯定要比1亿要小。 除了组数的减少增量序列,还有如何去对数据进行划分也会影响时间复杂度,比如对 还是举一个实例吧,还是这个数组:[18, 16, 12, 23, 48, 24, 2, 32, 6, 1] 使用间隔划分的方式明显可以看出越小的元素基本上在前面,越大的元素基本上在后面,这样使数组越来越趋于有序,直接插入排序也会越来越快。
希尔排序代码实现:
4.2.2性能分析
希尔排序是直接插入排序的一种优化。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 15:38:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |