排序
均未考虑边界条件
冒泡
比较相邻的,第一个大,就交换。$n^2$复杂度
1 | public void bubblie(int[] a){ |
选择
找最大,放最右边。然后继续$n^2$
1 | public void select(int[] a,int length){ |
插入
$n^2$ ,前n个已经排序,第n+1个,依次与前面的相比较。放到合适位置。
1 | public void insert(int[] a){ |
希尔排序
增量,分组,魅族插入排序,然后减小增量。$nlogn$
1 | public void shell(int[] a){ |
归并排序
分成n/2 子序列。分别采用归并。最后合并。$nlogn$ 稳定,需要额外空间。
1 | public static int[] MergeSort(int[] array) { |
快排
通常,枢纽元不应该选择第一个或者最后一个,int pivot = (int) (start + Math.random() * (end - start + 1));因为如果数组是排好序的,最坏的情况下,将会是$n^2$的,
while循环中的两个while循环不要加=号,会溢出边界
1 | public void quicksort(int[] a,int start,int end){ |
### 堆排序
平均$nlogn$ ,
1 | public void sort() { |
基数
数字的位数不能差太多,按照数字的位数排序
1 | public void radix(int[] a){ |
桶排序
计数排序的通用版,一个是利用数字,一个是利用hash。分到有限个桶里,每个桶再分别排序(可能用其他的排序方法)。
1 | private int indexFor(int a, int min, int step) { |
计数排序
用数组下标来表示数字大小,也就是hash的想法。
1 | public class CountingSort { |