本文将主要介绍一些常见的排序算法,使用语法为Java,默认排序方向为从小到大。
1.冒泡排序
原理很简单,直接上代码:
1 | // 冒泡排序 |
2.选择排序
选择排序的核心思想在于:
利用两个变量,一个存储当前最大值,一个存储当前最大值所在的索引。
依次比较后面的元素,如果发现比当前最大值大,则更新最大值,并且更新最大值所在的索引。
直到遍历结束,将最大值放在数组的最右边,也就是交换最右边元素和当前最大值元素。
重复上面的步骤。
代码实现如下,这里列出两种实现方式,本质是一样的:
1 | //选择排序1 |
3.插入排序(劣化版)
本节的插入排序直接选择将倒数第二个元素作为临时元素,核心思想如下:
- 在第一轮,抽离数组末尾倒数第二个元素,作为临时元素。
- 用临时元素与数组后面的元素进行对比,如果后面的元素值小于临时元素,则左移。
- 如果后面的元素大于临时元素,或者已经移动到数组末尾,则将临时元素插入当前的空隙中。
- 重复上面步骤,完成排序。
代码实现如下,这里列出两种实现方式,其中第一种方式与上述思路有细微差别,在第2,3步的处理上选择通过逐次交换元素的方式达成排序的目的,在时间复杂度上应该要劣于第二种方式:
(好吧其实第一种方式就是我当时自己根据思路写的,第二种方式是标准答案orz,不过我的方法不用考虑移动到尾部的情况,不知道算不算一个小优化?)
1 | // 插入排序1 |
4.插入排序(优化版)
在上文的劣化版插入排序,相当于是从尾至头遍历了一遍,如果将这种遍历与二分法查找结合,效率将会继续上升。
代码如下:
1 | // 插入排序 |