
回复
大家看到这个title的时候,脑子闪过的应该是什么排序呢?我想大家应该都有属于的答案。但是你会不会跟我一个第一个想到的是选择排序和插入排序。 其实原因也很简单,因为这是我们学习排序的时候,大家最先接触到的排序算法,以及可以说说我们最好理解的排序算法,我也个人认为它是很暴力的遍历算法。当然了,在这情况下,由于能量守恒定律,它的时间复杂度达到了不太好的0(n^2),但是我们也会经常使用这二个排序是为什么呢?,下面我给出一个表格
O(n) | O(nlogn) | O(n^2) |
---|---|---|
1 | 趋近于0 | 1 |
10 | 10 | 100 |
100 | 200 | 10000 |
1000 | 3000 | 1000000 |
/**
* @Author Piwriw.
* @Date 2022/1/19
* @motto 你不能做我的诗,正如我不能做你的梦.
*/
/**
* 选择排序
*/
public class SelectSort {
private SelectSort() {
}
public static <E extends Comparable<E>> void sort(E[] arr) {
for (int i = 0; i < arr.length; i++) {
int minIndex = i;
for (int j = i; j < arr.length; j++) {
if (arr[j].compareTo(arr[minIndex]) < 0) {
minIndex = j;
}
}
swap(arr, i, minIndex);
}
}
private static <E> void swap(E[] arr, int i, int j) {
E t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
/**
* @Author Piwriw.
* @Date 2022/1/19
* @motto 你不能做我的诗,正如我不能做你的梦.
*/
/**
* 插入排序
* 时间复杂度 最坏n*n,最快 n
*/
public class InsertionSort {
private InsertionSort() {
}
public static <E extends Comparable<E>> void sort(E[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j].compareTo(arr[j - 1]) < 0; j--) {
swap(arr, j, j - 1);
}
}
}
public static <E extends Comparable<E>> void sort2(E[] arr) {
for (int i = 0; i < arr.length; i++) {
E temp = arr[i];
int j;
for (j = i; j > 0 && temp.compareTo(arr[j - 1]) < 0; j--) {
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
private static <E> void swap(E[] arr, int i, int j) {
E t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}