插入排序包括:直接插入、折半插入、2-路插入、等。
直接插入排序的思想是:将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表(注意这里有移位操作,所以时间复杂度较大为o(n*n)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void direct_insert(vector<int>&num){
int len = num.size();
for(int i =1;i<len;++i){
int temp = num[i];//待插入元素
int j = i-1;//有序数列的最后一个元素所在位置
while(j>=0 && num[j]>temp){//不满足条件时进行移位
num[j+1] = num[j];
j--;
}
num[j+1] = temp;
}
}
int main()
{
int n;
while(cin>>n){
vector<int>nums(n);
for(int i =0;i<n;++i){
cin>>nums[i];
}
direct_insert(nums);
for(int i =0;i<n;++i){
cout<<nums[i]<<" ";
}
}
return 0;
}
折半插入排序主要是在上面简单插入排序的查找方面进行了优化,即在查找有序列中先比较中间位置与待插入数据的大小,从而将数据的比较次数较少,此处不再附上详细代码;其移动次数并未改变所以时间复杂度并未较少。
希尔排序:
希尔排序也是一种属于插入排序类的方法,但他是不稳定的;
其基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序;希尔排序中子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列。