伪代码
将第一个元素标记为已排序
for each unsorted element X
'extract' the element X
for j = lastSortedIndex down to 0
if current element j > X
将排序过的元素向右移一格
break loop and insert X here
InsertionSort(int[] arr){
for (int i = 0; i < arr.length; i++){
int temp = arr[i];
int j = i;
for( ; j > 0 && arr[j-1].toCompare(temp) > 0; j--){
arr[j] = arr[j-1];
}
arr[j] = temp;
}
}
InsertionSort.java
package com.algorithm.sort;
public class InsertionSort {
private InsertionSort() {
};
// public static void sort(Integer[] arr) {
// int n = arr.length;
// for (int i = 0; i < n; i++) {
// for (int j = i; j > 0; j--) {
// if (arr[j].compareTo(arr[j - 1]) < 0) {
// SortTestHelper.swap(arr, j-1, j);
// }
// else {
// break;
// }
// }
//
// }
// }
// 优化
// 使用赋值替代交换
public static void sort(Integer[] arr){
int n = arr.length;
for (int i = 0; i < n; i++){
Integer temp = arr[i];
int j = i;
for ( ; j > 0; j--){
if (arr[j-1].compareTo(temp) > 0){
arr[j] = arr[j-1];
}else {
break;
}
}
arr[j] = temp;
}
}
// 单元测试
public static void main(String[] args) {
int N = 20000;
Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);
System.out.println("排序前的数组为:");
SortTestHelper.printArray(arr);
InsertionSort.sort(arr);
System.out.println("-------------------------------------------");
System.out.println("排序后的数组为:");
SortTestHelper.printArray(arr);
System.out.println("-------------------------------------------");
System.out.println("排序后的数组是否有序:");
if (SortTestHelper.isSorted(arr)){
System.out.println("数组有序~");
} else {
System.out.println("数组无序!");
}
System.out.println("-------------------------------------------");
}
}