思想:
和打扑克的思想一样,我们抓拍的同时去给牌排序,每一次摸一张牌,就将它插入手上已有的牌中最合适的位置,逐步完成整改排序。
插入排序的两种写法
- 交换法:在新数字插入过程中,不断与前面的数字交换,知道找到自己合适的位置。
- 移动法,在新数字插入过程中,前面的数字不断往后挪出位置,当新数字插入找到自己的位置之后,插入一次即可。
交换法插入排序
直接上代码
class Solution {
public int[] sortArray(int[] nums) {
insertSort(nums);
return nums;
}
//插入排序方法
public static void insertSort(int[] nums){
if(nums.length <= 1){
return ;
}
for(int i=1; i<nums.length; i++){
int j = i;
while(j>=1 && nums[j] < nums[j-1]){
temp(nums, j, j-1);
j--;
}
}
}
//数据交换方法
public static void temp(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
代码简单易懂,好写好写。
移动法插入排序
代码:
class Solution {
public int[] sortArray(int[] nums) {
insertSort(nums);
return nums;
}
public static void insertSort(int[] nums){
if(nums.length <= 1){
return ;
}
for(int i=1; i<nums.length; i++){
int j = i-1;
int temp = nums[i];
while(j>=0 && temp < nums[j]){
nums[j+1] = nums[j];
j--;
}
nums[j+1] = temp;
}
}
}
时间及空间复杂度
- 时间复杂度: 使用双层循环,故复杂度为O(n^2)。
- 空间复杂度: 使用常数级临时变量,为O(1)。