
8种基础排序算法
2021-01-16 / highPhone啊
基础环境准备:创建一个数据大小为n,数值为1000范围内的随机数组,调用排序方法,分别输出排序前和排序后的数组:
1 | public static void main(String[] args) { |
插入排序
基本思想
从数组的第一个元素开始,即下标0开始,维护一个有序序列,从数组第一个元素开始遍历到数组结束,每个元素去前面维护的有序序列中找到自己的正确位置,然后插入有序序列中,外层遍历结束,数组就是有序的了。下图是插入排序动画演示:
代码实现
1 | //此处实现为由小到大升序排列 |
排序效果
2000个值在0~1000之前的随机数组,排序耗时为5ms:
时间复杂度和空间复杂度
- 空间复杂度
插入排序空间复杂度是O(1)。 - 时间复杂度
- 在最好情况下,给定待排序数组就是有序的,所以只需要从下标1到n-1遍历一边,此时时间复杂度是O(n-1)即**O(n)**。
- 在最坏情况下,给定待排序数组是逆序的,当外层为i是,内层循环需要判断的次数也为i,所以总次数为 1 + 2 + … + n -1 = n * (n-1) / 2 = 0.5(n^2) - 0.5n, 此时时间复杂度是O(n^2)。
- 在平均情况下,插入排序的时间复杂度也是O(n^2),具体计算过程,见如下文章:插入排序——平均算法复杂度分析
冒泡排序
基本思想
冒泡排序需要两层循环,外层循环控制总共需要进行多少次冒泡操作,内层循环则负责进行冒泡: 假设数组长度为n,当前是第i次冒泡操作,则需要在[0,n-1-i)区间内,对相邻的两个元素进行比较,把元素值大的元素放到相邻位置中靠后的位置(冒泡)。下图是冒泡动画演示:
代码实现
1 | /*** |
排序效果
2000个值在0~1000之前的随机数组,排序耗时为9ms:
时间复杂度和空间复杂度
- 空间复杂度
冒泡排序空间复杂度是O(1)。 - 时间复杂度
- 在最好情况下,给定待排序数组就是有序的,外层循环次数是n-1次,内层循环仍然需要对相邻元素做比较判断,所以时间复杂度是 n - 1 + n-2 + … + 1 = n * (n-1) / 2 = 0.5(n^2) - 0.5n, 此时时间复杂度是O(n^2)。
- 在最坏情况下,给定待排序数组是逆序的,此时循环的次数跟最好情况下是一样的,但此时内层循环除了要进行比较还要进行交换操作,所以耗时会比最好情况下多一些,但时间复杂度量级仍然是O(n^2)。
- 由上可知,在平均情况下,冒泡算法的时间复杂度也是O(n^2)。
选择排序
基本思想
选择排序也是需要两层循环,外层循环控制选择操作的次数,内层循环中寻找第i次选择的元素,即第i小的元素。如果数组长度为n,外层循环遍历到第i次,内层循环选择操作需要遍历的次数为n - i - i。下图是选择排序动画演示:
代码实现
1 | /*** |
排序效果
2000个值在0~1000之前的随机数组,排序耗时为8ms:
时间复杂度和空间复杂度
- 空间复杂度
选择排序空间复杂度是O(1)。 - 时间复杂度
- 在最好情况下,给定待排序数组就是有序的,外层循环次数是n-1次,内层循环进行选择的时候仍然需要进行判断,所以时间复杂度是 n - 2 + n-3 + … + 1 = (n - 1) * (n-2) / 2 = 0.5(n^2) - 1.5n + 1, 此时时间复杂度是O(n^2)。
- 在最坏情况下,给定待排序数组是逆序的,此时循环的次数跟最好情况下是一样的,所以此时时间复杂度仍然是O(n^2)。
- 由上可知,在平均情况下,选择排序算法的时间复杂度也是O(n^2)。
快速排序
基本思想
- 快速排序通常需要设定一个基准数,以基准数来遍历数组,把所有大于基准数的数组元素放在基准数右边,所有小于基准数的数组元素放在基准数左边,这样,以基准数为中心,把数组分成了左半边和右半边两部分数组(分而治之思想)。
- 再利用递归思想,分别把左边和右边两部分分别再重复步骤一。
算法步骤如下图:
代码实现
1 | /*** |
排序效果
2000个值在0~1000之前的随机数组,排序耗时为1ms:
时间复杂度和空间复杂度
快速排序的空间复杂度与时间复杂度归纳过程涉及到更多的数学知识,这里不做详尽展开,具体可参考博文快速排序最好,最坏,平均复杂度分析
- 空间复杂度
快速排序空间复杂度与其递归深度有关,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。 - 时间复杂度
- 在最好情况下,快速排序算法的时间复杂度为O(nlogn)。
- 在最坏的情况下,其时间复杂度为O(n^2)。
- 在平均情况下,其时间复杂度为O(nlogn)。
未完待续
本文链接:https://highphone.xyz/87dda92b.html