插入排序
简介
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
基本思想
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
时间复杂度
平均时间复杂度和最坏时间复杂度都是O(n²)
代码
public static void test () {
int[] arr = {5,1,10,7,-2};
//第一轮,无序表中已经有数据5
int value = arr[1];
int index = 0;
while (index >= 0 && value < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
//value的值比下标为index的数大,就放在它的后面
arr[index + 1] = value;
System.out.println("第一次排序=======");
System.out.println(Arrays.toString(arr));
//第二轮,无序表中已经有数据1,5
value = arr[2];
index = 1;
while (index >= 0 && value < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
//value的值比下标为index的数大,就放在它的后面
arr[index + 1] = value;
System.out.println("第二次排序=======");
System.out.println(Arrays.toString(arr));
//第三轮,无序表中已经有数据1,5,10
value = arr[3];
index = 2;
while (index >= 0 && value < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
//value的值比下标为index的数大,就放在它的后面
arr[index + 1] = value;
System.out.println("第三次排序=======");
System.out.println(Arrays.toString(arr));
//第四轮,无序表中已经有数据1,5
value = arr[4];
index = 3;
while (index >= 0 && value < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
//value的值比下标为index的数大,就放在它的后面
arr[index + 1] = value;
System.out.println("第四次排序=======");
System.out.println(Arrays.toString(arr));
}
以上代码可以简写为:
public static void insertSort (int[] arr) {
int value;
int index;
for (int i = 1; i < arr.length; i++) {
value = arr[i];
index = i - 1;
while (index >= 0 && value < arr[index]) {
arr[index + 1] = arr[index];
index--;
}
if (index + 1 != i) {
arr[index + 1] = value;
}
}
}