选择排序
- 总是把还没处理的最小的那个元素拿出来(从小到大),可以进行原地排序
public class SelectionSort {
private SelectionSort() {
}
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;
}
public static void main(String[] args) {
Integer[] arr={1,4,2,3,6,5};
SelectionSort.sort(arr);
for (int e:arr)
System.out.print(e+" ");
System.out.println();
}
}

插入排序
- 与选择排序的区别在于前面排序的对象是暂时稳定的排序
- 对于有序数组,插入排序的复杂度是O(n),整体的复杂度是O(n^ 2),而选择排序是稳定的排序算法,O(n^ 2)
public class InsertionSort {
private InsertionSort() {
}
public static <E extends Comparable<E>> void sort(E[] arr) {
for (int i = 0; i < arr.length; i++) {
E t = arr[i];
int j;
for (j = i;j - 1 >0 && t.compareTo(arr[j-1])<0;j--){
arr[j] = arr[j-1];
}
arr[j] = t;
}
}
public static void main(String[] args) {
Integer[] arr = {1, 4, 2, 3, 6, 5};
InsertionSort.sort(arr);
for (int e : arr)
System.out.print(e + " ");
System.out.println();
}
}
