思路
将数组分为已排序序列和待排序序列,已排序序列在前,待排序序列在后。将待排序序列中的第一个元素作为待插入元素,从后往前与已排序序列中的元素逐个比较,并把比待插入元素大的元素向后移动,直到找到待插入元素应该插入的正确位置并把它插入。
代码
public static void insertionSort(int[] arr) {
for(int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j;
for(j = i-1; j >= 0; j--){
if(arr[j] > temp) {
arr[j+1] = arr[j];
}else{
break;
}
}
arr[j+1] = temp;
}
}
性能分析
时间复杂度:
具体分析可参考插入排序最好、最坏、平均情况时间复杂度分析
- 最好:顺序序列,每次从后向前遍历只做一次判断变退出循环, O ( n ) O(n) O(n)
- 最差:逆序序列,每次从后向前遍历做完所有的判断, O ( n 2 ) O(n^2) O(n2)
- 平均:O(n^2)
空间复杂度:
O
(
1
)
O(1)
O(1)
稳定性: 稳定