插入排序的思路
- 对 A[0…n-1] 排序,只需要将 A[0…n-2] 排好序,然后把 A[n-1] 插入到已排序数组的合适位置即可
- 本质是基于Divid and Conquer 思路
- Divid 策略:基于元素下标
- A[0…n-1] = A[0…n-2] + 一个单独的元素
- A[0…n-2] 与 A[0…n–1] 有相同的结构,但是规模更小
- 对 A[0…n-2] 排序构成原问题的 sub-problem
- Divid 策略:基于元素下标
- 时间复杂度
- 最坏:所有元素都逆序排列,O(n) = O(n^2)
- 最好:所有元素都顺序排列:O(n) = n
- 平均:O(n^2)
插入排序的C++实现
#include<iostream>
#include<vector>
using namespace std;
void InsertSort(vector<int>& v){
if(v.empty())
return;
int v_len = v.size();
// default:v[0] is sorted
for(int i = 1; i < v_len; i++){
int insert_key = v[i];
int j = i-1;
while(j >= 0 && insert_key < v[j]){
v[j+1] = v[j];
j--;
}
v[j+1] = insert_key;
}
}
int main(){
vector<int> v{1,3,8,5,7,4};
InsertSort(v);
for(int val:v)
cout<<val<<" ";
return 0;
}
插入排序优化思路
- 子问题数量上减小得太慢,每次只减一个元素,因此需要依次减少 n 次,每次又要比较最多 n 个元素,造成 O(n^2) 的时间复杂度
- Divid 策略 2:基于元素的下标
- A[0…n-1] = A[0…n/2 -1] + A[n/2…n-1]
- 子问题每次变为原问题的一半,即 归并排序 的思想
此篇文章为卜东波老师的算法课总结。