一、排序思路
将原有的数组看为两块,一块是已经排好序的(我们叫有序区),一块是待排序的(我们叫无序区),不断地从无序区中取出其第一个元素,搜寻该元素应该放在有序区的哪个位置,并将该元素放入该位置,完成这个步骤后,有序区长度+1,无序区长度-1,直至无序区长度为0,即无序区中不再有元素,排序就完成啦。
举个例子:
给定一组数:9 3 1 5 2 4 3 8从小到大进行排序,图示:
代码实现:
/**
* 插入排序
*/
@Test
public void insertTest() {
int[] arr = { 9, 3, 1, 5, 2, 4, 3, 8 };
System.out.println("初始化数据为:" + Arrays.toString(arr));
int temp;
for (int i=1; i<arr.length; i++){
//待排元素小于有序序列的最后一个元素时,向前插入
if ( arr[i] < arr[i-1] ){
temp = arr[i] ;
for (int j=i; j>=0; j--){
if ( j > 0 && arr[j-1] > temp ) {
arr[j] = arr[j-1] ;
}else {
arr[j] = temp ;
break;
}
}
}
System.out.println("第" + i + "次排序后数据:" + Arrays.toString(arr));
}
System.out.println("最终排序后的数据:" + Arrays.toString(arr));
}
运行结果截图:
插入算法时间空间复杂度
- 时间复杂度:
最好【已排好序】:O(n)
最坏【逆序】:O(n^2)
平均:O(n^2) - 空间复杂度:O(1)
- 稳定性:稳定