简介:插入排序和选择排序一样都是时间复杂度为O(N^2)的排序算法,相较于选择排序,插入排序可以提前终止内层循环,因此在性能上如果使用得当,要比选择排序性能好,尤其是面对近乎有序的源数据时,性能更是碾压选择排序甚至会比一些O(NlgN)的算法还要好.
原理:将一个数组划分为两部分,第一部分是已经排好序的,第二部分为未排序的,从未排序部分的第一个数据开始,逐一与前面已排好序的数据进行比较,如果比那个数据小就与之交换,直到该数据比当前数据大为止.按照以上原理将所有数据进行排序.
步骤
①从未排好序的数据中取出第一个数据,作为待排序数据A
②用A与前面已排好序的数据B进行对比用来确定A应该放到哪个位置,如果A比B还小就应该交换A与B,否则停止内层循环,该位置就是A应处于的位置
③重复①②步骤直到没有未排序的数据为止
public class InsertionSort {
public static void main(String[] args) {
int[] arr = SortUtils.createArray(10000);
int[] arr2 = SortUtils.copy(arr);
sort(arr);
betterSort(arr2);
}
public static void sort(int[] arr) {
long starttime = System.currentTimeMillis();
for (int i = 1; i <= arr.length - 1; i++) {
for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) {
arr[j - 1] = arr[j - 1] + arr[j];
arr[j] = arr[j - 1] - arr[j];
arr[j - 1] = arr[j - 1] - arr[j];
}
}
System.out.println("sort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
}
/**
* 改进后的插入排序,在具有较少的元素类型值,或者比较有序的源数据进行排序时,可以有比较好的效果
* @param arr
*/
public static void betterSort(int[] arr) {
long starttime = System.currentTimeMillis();
for (int i = 1; i <= arr.length - 1; i++) {
int t = arr[i];
int j = i;
for (; j > 0 && arr[j - 1] > t; j--) {
arr[j] = arr[j - 1];
}
if (j != i) {
arr[j] = t;
}
}
System.out.println("betterSort time = " + (System.currentTimeMillis() - starttime) + " 毫秒");
}
}
以下是运行截图
结论:优化之后的插入排序比未优化的插入排序 性能会好一些, 比选择排序更是全方位的胜出