package cn.com.dom4j.sort;
import java.util.Arrays;
public class Test2 {
/*
插入排序
插入排序是最简单的排序算法之一
插入排序由 N - 1趟排序组成, 对于 p = 1到 N - 1趟, 插入排序保证从 0到位置 p - 1上的元素为已排序状态
基本思路: 在第 p趟, 我们将位置 p上的元素向左移动, 知道它在前 p + 1个元素中的正确位置被找到的地方
*/
public static <AnyType extends Comparable<? super AnyType>> void insertionSort_1(AnyType[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j].compareTo(arr[j - 1]) < 0; j--) {
swap(arr, j, j - 1);
}
}
}
/*
上面排序中存在的缺陷:
在寻找第 p个元素的正确位置时, 采用了相邻元素比较并交换位置的方式, 这样会产生多余赋值操作
解决方式:
记录第 p个元素的值, 逐一和前面元素比较, 比 p大的元素, 位置后移一个 (a[j] = a[j-1]), 直到遇到比 p小的元素.
最后把 p放在终止时的位置(第一个遇到的比 p小的元素后面)即可
*/
/**
* 优化过后的插入排序
*/
public static <AnyType extends Comparable<? super AnyType>> void insertionSort_2(AnyType[] a) {
int j;
for (int p = 1; p < a.length; p++) {
AnyType tmp = a[p];
for (j = p; j > 0 && tmp.compareTo(a[j - 1]) < 0; j--)
a[j] = a[j - 1];
a[j] = tmp;
}
}
/**
* 交换数组中两个元素的位置
*/
public static <AnyType extends Comparable<? super AnyType>> void swap(AnyType[] arr, int i, int j) {
if (arr == null || arr.length <= 1 || i == j) {
return;
}
AnyType tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}