一.前提
1.为简单起见,讨论从小到大的整数排序
2.只讨论基于比较的排序(< = >有定义)
3.只讨论内部排序
4.稳定性:任意两个相等的数据,排序前后相对位置不发生变化
二.插入排序原理
(本文只讨论直接插入排序)
直接插入排序的思想是每次将一个待排序的元素按照其大小插入到前面已经排好序的子序列中,直到元素全部插入。
已经排好序的序列 array(1 ~ i-1) | 待排序的元素array(i) | 未排好序的序列array(i+1 ~ n) |
---|
三.实现
public int[] Insertion_Sort(int[] array){
//把i设为从1开始,因为第0个元素不需要排序,前面只有它自己
//也防止下面的j-1出现数组下标越界的情况
for(int i = 1; i < array.length; i++){
int temp = array[i];
int j;
//需要注意的是,待排序元素前面的元素已经排好序了
//就是说,如果array[j-1]的元素比待排序元素小,则前面的元素也一定会比待排序元素小
//于是条件不满足,循环跳出
for(j = i; j > 0 && array[j-1] > temp; j--)
array[j] = array[j-1];
//循环出来的j就是待排序元素的位置
array[j] = temp;
}
return array;
}
四.时间复杂度
- 最好情况:顺序, T(n) = O(n)
- 最坏情况:逆序, T(n) =O(n2)
五.空间复杂度
所有操作都是在一个数组内进行的,没有额外的添加空间
S(n) = O(1)