直接插入排序是 -插入类排序-的一种
具体过程:数组第二个及后面的元素位置依次放入到一个整型变量observe中,依次作为监视哨,依次和后面的元素data[i]比较,如果 observe < data[i], 则data[i+1] = data[i]
接着和data[i-1]比较,直到遇到一个小于或等于observe的元素data[k],此时data[k]后面一定是空位置,data[k+1] = observe
从 i = 1到 i = n 重复这个过程,即可完成直接插入排序
从空间上来看 只需要一个observe,所以空间复杂度为O(1)
算法 最坏情况:完全逆序,则while循环中需要比较和移动 i-1次 , 复杂度O(n^2)
最好情况:完全顺序,则for循环每轮对应的while循环只执行一次, 复杂度O(n)
直接插入算法适用于待排序数目较少且基本有序的情况
上代码:
public class Test {
private static int[] data;
public static void Sort() {
int observe; // 监视哨,插入排序肯定是需要某段元素后移,所以需要保存当前正在比较的元素
for (int i = 1, j; i < 10; i++) {
j = i - 1; // 定义j是为了while循环向前比较
observe = data[i];
while (j >= 0 && observe < data[j]) { // j>=0 是防止数组越界
data[j + 1] = data[j];
j--;
}
data[j + 1] = observe;
}
}
/**
*
* 用增强for循环输出当前数组
*/
public static void PrintData() {
for (int i : data) {
System.out.print(" " + i);
}
System.out.println("");
}
public static void main(String[] args) {
data = new int[10];
System.out.println("输入十个数 进行直接插入排序");
Scanner scanner = new Scanner(System.in);
for (int i = 0; i < 10; i++) {
data[i] = scanner.nextInt();
}
Sort();
PrintData();
scanner.close();
}
}