插入排序:
思路:
将整个数组划分为有序区间和无序区间。每次取无序区间的第一个元素,在有序区间里从后往前遍历找合适位置插入,并将有序区间进行搬运,保证插入后有序区间仍是有序的。用两个循环嵌套,外部循环更新bound的值,更新区间划分,内部循环用来给无序区间查找合适位置。(要注意边界情况)
时间复杂度:O(N^2);
空间复杂度:O(1);
稳定性:稳定
特点:
- 当待排序区间的元素较少时,排序效率很高。
- 当整个数组比较接近有序时,效率较高。
基于上特点,有优化插入排序的方法:希尔排序。
package sort;
import java.util.Arrays;
public class insertSort {
//插入排序,默认升序
public static void insertSort(int [] array){
for (int bound=1;bound<array.length;bound++){
//[1,bound):已排序区间
//[bound,size):未排序区间
int v=array[bound];//将bound位置的元素先备份一份,
// 这是未排序区间的第一个元素
//cur保存已排序区间的最后一个元素
int cur= bound-1;
//将bound在已排序区间中找到合适的位置插入,从后往前查找
for (;cur>=0;cur--){
//要去跟v比较,不要跟array[bound]比较,因为bound的值下次就变了
if (v < array[cur]){
//如果这里改为<=,则排序不稳定
//若cur的值大,则将cur向后调整
array[cur+1]=array[cur];
}
else { //若v的值大,则不动
break;
}
}
//将备份的bound-1的值,向前调整,因为循环里cur--了,所以这里要cur+1
array[cur+1]=v;
}
}
public static void main(String[] args){
int[] array={9,5,6,0,4,2,7,3,8};
insertSort(array);
System.out.println(Arrays.toString(array));
}
}