十大排序算法-------详解(Java源码)汇总
话不多说:对于排序算法,可以大致的分为两类 :
- 比较类排序:通过比较决定元素之间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序,相反道理,不通过比较来决定元素之间的相对次序,它可以突破基于比较排序的时间下界,以线性时间来运行,因此也称为线性时间非比较类排序
仿照网络大神做了一张思维导图:
对于算法复杂度:
在先了解其复杂度及稳定性之前,我们先了解一下什么是复杂度和稳定性:
时间复杂度和空间复杂度:
定义:一个算法中的语句执行次数称为语句频度或者时间频度;
一般来:检验算法的效率,主要考虑最坏时间复杂度和平均时间复杂度。如果没有严格说明,那就是以最坏时间复杂度为标准计量。
时间复杂度:
-
-
- 概念
- 一个算法执行所耗费的时间,从理论上讲是无法计算,明确的。但是单从具体算法执行花费时间来判断算法是不可选。那么我们可以知道一个算法执行所花费的时间和算法中语句的执行次数是成正比的,那么我们从理论上就可以知道算法执行的次数多,那么它的花费时间就多。
- 在时间频度中,n是称为问题的规模,当n不断发生变化时,时间频度T(n)也会不断变化。但是它的变化是有规律的,所以就可以用时间复杂度这个理论上的概念来描述。一般来说,算法中的基本操作重复次数的是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得n在趋近无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n) = O(f(n)),那么称O(f(n))为算法的渐进时间复杂度,那么就是我们俗称的时间复杂度。
- 计量方式
- 如果算法的执行时间不会随着问题的规模n的增长而增长,那么即使算法中存在有上千万条代码语句,但是它是执行时间也就是一个常数。此类算法时间复杂度均为O(1);
- 按照数量级递增的。常见的时间复杂度有:常数阶O(1),对数阶O(㏒₂n),线性阶O(n),线性对数阶O(n㏒₂n),平方阶O(n²),立方阶O(n³)………等,K次方阶O(nk),指数阶O(2ⁿ)。当然随着问题规模n的不断增加,那么以上的时间复杂度也会随之不断增加的,那么算法的执行效率也会随之下降。
- 最简单的计量方式:一个循环为n,一个嵌套为n的+1次方,并列时是+n,最后结果取最大值。
- 概念
-
空间复杂度
-
-
- 一个程序的空间复杂度是指运行完一个程序所需内存的大小
- 固定部分。这部分空间的空间大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(代码空间)、数据空间·(常量、简单变量)等所占的空间。这部分属于静态空间。
- 可变空间,这部分空间的主要包括动态分配的空间,已经递归栈所需的空间等。这部分空间的大小与算法有关。
- 一个算法所需的存储空间用f(n)表示。S(n) = O(f(n)),那么其中的n为问题的规模,S(n)表示空间复杂度。
- 一个程序的空间复杂度是指运行完一个程序所需内存的大小
-
稳定性
-
-
- 只如果a排序前处于b前面,a==b,排序完后a任然处于b前面,此为稳定,反之不稳定。
-
排序直通车:
1.冒泡排序:https://blog.csdn.net/qq_40223688/article/details/88618520
2.选择排序:https://blog.csdn.net/qq_40223688/article/details/88618757
3.插入排序:https://blog.csdn.net/qq_40223688/article/details/88618783
4.希尔排序:https://blog.csdn.net/qq_40223688/article/details/88618810
5.归并排序:https://blog.csdn.net/qq_40223688/article/details/88618828
6.快速排序:https://blog.csdn.net/qq_40223688/article/details/88618864
7.堆排序:https://blog.csdn.net/qq_40223688/article/details/88619031
8.计数排序:https://blog.csdn.net/qq_40223688/article/details/88619105
9.桶排序:https://blog.csdn.net/qq_40223688/article/details/88619125
10.基数排序:https://blog.csdn.net/qq_40223688/article/details/88619131