Java学习笔记:2022年1月13日~18日排序专题汇编
摘要:我在2022年的1月13日到一月18日期间进行了十种排序的学习,为了更加简洁明了的展现这些排序,我决定把它们写在一篇笔记中,以便日后查阅的时候能够一次性复习。
一.前言
我们在很多地方存在排序行为,比如按照成绩进行排名,按照身高进行排名等等…而在算法中,排序的意义不仅仅止步于对某些事物进行排名,排序可以让一个无序的数组变得有序,进而在安置查找的时候让这个数组使用二分查找的方式,有效降低算法的时间复杂度,排序代码的书写在算法比赛中也具有非凡的意义,有些算法需要你自己书写排序算法进行打表,一个高效的排序算法有助于你算法的整体成绩。因此,排序在程序员群体中越来越重要,就好比西部抢手的对决,谁拔枪快,谁就胜利,排序就是程序员的拔枪,是程序员的居合,我们需要熟悉并能够快速的书写出排序算法。接下来我将介绍十种重要的排序方法,要想成为一个比较优秀的程序员,首先就要掌握这十种重要的排序方法,掌握好之后,我们就可以像亚瑟摩根一样,不,像布兰迪一样拎着四袋黄金回家了(但愿吧)。
二.排序算法
排序算法主要分为如下十种,在这里列出他们的各种评估参数,哪种排序算法有什么优势有什么缺点,这样列出一目了然,点击相应的排序算法名可以跳转链接,进入到其详细的解释中去。
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place | 稳定 |
选择排序 | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
插入排序 | O ( n 2 ) O(n^2) O(n2) | O ( n ) O(n) O(n) | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) | In-place | 稳定 |
希尔排序 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g 2 n ) O(nlog^2n) O(nlog2n) | O ( n l o g 2 n ) O(nlog^2n) O(nlog2n) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
归并排序 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n ) O(n) O(n) | out-place | 稳定 |
快速排序 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n 2 ) O(n^2) O(n2) | O ( l o g n ) O(logn) O(logn) | In-place | 不稳定 |
堆排序 | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( 1 ) O(1) O(1) | In-place | 不稳定 |
计数排序 | ||||||
桶排序 | ||||||
基数排序 | O ( n × k ) O(n×k) O(n×k) | O ( n × k ) O(n×k) O(n×k) | O ( n × k ) O(n×k) O(n×k) | O ( n + k ) O(n+k) O(n+k) | Out-place | 稳定 |
PS:本文在听课学习的基础上还参考了文章:十大经典排序算法 ,这篇文章好的很,把所有的排序都讲明白了,如果不想看我写的笔记可以直接看它的,非常有用。