插入排序
思路描述
维护一个已排序数组
1.将每次要处理的元素插入到已排好序的数组
2.插入位置之后的已排好序的元素后移
3.从头至尾遍历待排序元素数组
关键点
1.插入位置的判定:从后往前比较
2.比较的同时可以对已排序元素向后移位,注意保存被覆盖掉的待排序元素
3.边界条件,例如插入排序处理的是vector中的全部元素,而size()函数比元素个数大1
3 代码实现
#include <iostream>
#include <vector>
using namespace std;
//以下函数实现对vector<double>序列指定的范围进行升序排序
void insertingsort(vector<double> & A, int p, int r)
{
for (int i=p+1; i<=r; ++i) //遍历容器
{
double key = A.at(i); //保存待排序元素以免移位被覆盖
int j;
for(j=i-1; (j>=p) && (key < A.at(j)); --j) //确定插入位置同时进行移位;从后至前,在插入位置停止
{
A.at(j+1) = A.at(j);
}
A.at(j+1) = key; //插入待排序元素
}
}
//编写主函数测试
int main()
{
double arr[] = {234, 12, 34, 3.23, 34.3, 23, 124, 1, 2, 5, 3, 9, 12};
vector<double> A(arr, arr+13);
//打印初始序列
for (int i=0; i<A.size(); ++i)
{
cout<<A[i]<<" ";
}
cout<<endl;
//初始化参数,调用函数进行排序
int p=0;
int r=A.size()-1;
insertingsort(A, p, r);
//打印排序之后的序列
for (int i=0; i<A.size(); ++i)
{
cout<<A[i]<<" ";
}
cout<<endl;
return 0;
}
4 运行分析
1) 最坏情况下比较次数为(n^2)/2, 移位次数亦(n^2)/2, 时间复杂度Θ(n^2). 当元素逆序时为最坏情况.
2) 最好情况下比较次数为n-1. 当容器元素已按升序排好为最好情况.