排序算法一直是程序员开发和面试的重点,本文将重点讲解几种常用的排序算法。
稳定性
对于一个数组a {6,2,4,6,1}
,其中有两个值为 6,为 a[0] 和 a[3],排序之后的结果有两种
1 | 2 | 4 | 6 | 6 |
---|---|---|---|---|
a[4] | a[1] | a[2] | a[0] | a[3] |
a[4] | a[1] | a[2] | a[3] | a[0] |
如果排序结束之后,a[0] 可以保证一定在 a[3] 前面,即原有的顺序不变,则该算法属于稳定的排序算法
冒泡排序、基数排序、插入排序、归并排序、桶排序、二叉树排序等
否则,属于不稳定的排序算法
选择排序,希尔排序,堆排序,快速排序等
冒泡排序
/** |
插入排序
插入排序可以分为直接插入排序,以及其变种——折半插入排序、希尔排序
直接插入排序
/** |
折半插入排序
/** |
希尔排序
/** |
桶排序(基数排序)
/** |
归并排序
/** |
选择排序
/** |
快速排序
/** |
二叉树排序
通过二叉树的中序遍历实现。如果二叉排序树是平衡的,则时间复杂度为 $O(\log_2 n)$
近似于折半查找。
如果二叉排序树完全不平衡,则时间复杂度为 $O(n)$
public class BinarySortTree { |
调用如下
public static void main(String[] args) { |
查找算法
二分查找
只能对有序序列进行查找
public static int binarySearch(int[] array, int low, int high, int target) { |
顺序查找
实现较简单,略过
二叉树查找
可以通过构建一个二叉搜索树实现