总结常见的10中排序模型
本文主要汇总下常见的10中排序模型,用一张图概括如下:

- 排序稳定性:相同元素的排序后顺序是否是固定的
冒泡排序
- 两次循环,每个都和后面的数进行比较,如果当前数大于后面的数则交换位置。
- 每循环一次,当前的最后的一个数为当次循环的最大数。
1 | public static void sort(int[] ints){ |
选择排序
- 找到数组(0 - n)中的最大值,放到数组最后。
- 在循环找到数组(0 - n-1)中的最大值,放到n-1的位置,如此循环知道最后完成。
1 | private static void sort(int[] ints){ |
插入排序
- 两层遍历,二层遍历遍历当前index前面的值,如果当前值小于前面的值,则交换位置
- 知道前面的值小于等于当前值
1 | private static void sort(int[] ints){ |
计数排序
- 将当前数组中的值转化为一个新数组的下标。
- 新数组的值为当前下标在目标数组中的个数,新数组的大小为
最大值 - 最小值 + 1。 - 最后将新数组中的值按顺序重新复制到老数组中。
- 如果最大值和最小值相差太多的,会存在空间浪费的情况。
1 | private static void sort(int[] ints){ |
桶排序
- 将数组中的值按照大小分到固定几个桶中。
- 将每个桶中的数据都分别进行排序(使用其它的排序算法,如插入排序)。
- 最后将每个桶中的数据重新复制到原数组中。
1 | // num 为桶的个数 |
基数排序
- 按照数据的位数来排序,方式类型桶排序,只是桶中的数据不用再排序了。
- 固定10个桶,编号0-9。
- 从个、十、百…位开始遍历,位数比较小的补0。
- 每次遍历将值放到对应位数的数字对应桶中,然后合并。
1 |
|
希尔排序
- 拆分 -> 每组插入排序 -> 拆分 -> 每组插入排序 …
- 只到最终拆分成每组的间隔只有1
1 | private static void sort(int[] ints){ |
快速排序
- 找到一个基准值 然后设置左右两个指针,当左边的大于基准值、右边的小于基准值,则交换位置
- 当左指针>=右指针时与基准值交换位置
- 再分别重复基准值左边的部分和右边的部分,知道里面的拆分里面的元素只有一个
1 | private static void sort(int[] param,int left ,int right){ |
归并排序
- 先将数组进行拆分,一直拆到只有一个元素
- 再将数组进行合并,合并的时候进行排序
1 |
|