介绍
将数组分为两部分,左部分已经排好序,右部分待排序,初始左边部分只有数组第一个元素
待排序部分的第一个元素和左边元素比较如果比左边元素小,交换位置,直到该元素比左边元素大
不断重复上述步骤直到待排序元素个数为0
void insertSort(vector<int>& nums){
int size = nums.size();
for (int i = 1; i < size; i++){//待排序元素的下标
if (nums[i] < nums[i - 1]){//不满足比左边元素大
for (int j = i; j>0; j--){//左移找到适合自己的位置
if (nums[j] < nums[j - 1])
swap(nums[j], nums[j - 1]);
}
}
}
}时间复杂度
最差情况 逆序排序的情况下每一次都要完全遍历一遍排好序的部分才能找到自己的位置,第i次需要遍历i个元素,一共遍历n-1次,时间复杂度为O(n²)
最优情况 顺序排序情况,每次只和排好序部分最后一个元素比较,一共n-1次,时间复杂度为O(n)
空间复杂度
不借助辅助空间,为O(1)