1. 直接插入排序
1.1 算法思想
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
1.2 算法描述
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个未排序元素,在已经排序的元素序列从后向前扫描;
- 将已排序元素和取出的未排序元素进行比较,不符条件则将该元素移到后一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
1.3 复杂度分析
可以看到,直接插入排序需要两次遍历,在最坏情况下每个未排元素插入到数组开头,时间复杂度为O(N^2),最好情况下每个未排元素插入到已排元素的末尾,时间复杂度为O(N)。
仅使用了两个指针,空间复杂度为O(1)。
最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 |
---|---|---|---|
O(n) | O(n^2) | O(n^2) | O(1) |
2. 代码实现
2.1 Java版
class Solution {
public int[] sortArray(int[] nums) {
int[] arr = new int[nums.length];
// 拷贝数组
System.arraycopy(nums,0,arr,0,nums.length);
insertSort(arr);
return arr;
}
private void insertSort(int[] arr){
for(int i = 0; i <arr.length; ++i){
// 找到上一个已排序元素
int cur = arr[i], j = i-1;
// 进行比较并交换
while(j >=0 && arr[j] > cur){
arr[j+1] = arr[j];
--j;
}
// 将未排序元素插入到合适位置
arr[j+1] = cur;
}
}
}