二、插入排序
1.直接插入排序
这里我们注意,元素的选择是从第二个元素开始!动态过程如下:
递增的代码实现:
#include<iostream>
using namespace std;
void insertsort(int a[],int len)
{
//从第二个元素开始比较
for(int i=1; i<len; i++)
{
//设置一个哨兵,赋值为待插入元素
int soldier = a[i];
//从待插入元素开始向前遍历
for(int j=i-1; j>=0; j--)
{
//若大于前一个元素,则在前一个元素后面赋值
if(soldier>=a[j])
{
a[j+1] = soldier;
break;
}
//若小于前一个元素,则继续向前走,前一个元素后移
else
{
a[j+1] = a[j];
//若比第一个元素还小,则放在第一个位置上
if(j==0)
{
a[j] = soldier;
}
}
}
}
cout<<"排序后为:"<<endl;
for(int k=0; k<len; k++)
{
if(k==0)
{
cout<<a[k];
}
else
{
cout<<" "<<a[k];
}
}
cout<<endl;
}
int main()
{
int a[] = {2,4,3,5,1,6};
int len = sizeof(a)/sizeof(int);
cout<<"数组的元素为:"<<endl;
for(int k=0; k<len; k++)
{
if(k==0)
{
cout<<a[k];
}
else
{
cout<<" "<<a[k];
}
}
cout<<endl;
insertsort(a,len);
return 0;
}
算法分析:
优点:简单,稳定。
总比较次数:
最好:n-1(有序)
最坏:(n+2)(n-1)/2(逆序有序)
总移动次数:
最好:0
最坏:(n+4)(n-1)/2
时间复杂度
最好 O(n)
最坏 O(n^2)
平均 O(n^2)
空间复杂度 O(1)
稳定的排序算法。
因为每次比较时,前面的序列均是有序的,我们在查找时可以采用不同的查找方案,不一定要用顺序查找,如果我们用二分查找,则我们的排序即为:
折半插入排序:(直接附代码)
#include<iostream>
using namespace std;
void Binsertsort(int a[],int len)
{
for(int i=1; i<len; i++)
{
int soldier = a[i];
int low = 0;
int high = i-1;
//找到位置
while(low<=high)
{
int mid = (low + high)/2;
if(soldier<a[mid])
{
high = mid -1;
}
else
{
low = mid + 1;
}
}
//插入
for(int j=i-1; j>=high+1; --j)
{
a[j+1] = a[j];
}
a[high+1] = soldier;
}
cout<<"排序后为:"<<endl;
for(int k=0; k<len; k++)
{
if(k==0)
{
cout<<a[k];
}
else
{
cout<<" "<<a[k];
}
}
cout<<endl;
}
int main()
{
int a[] = {2,4,3,5,1,6};
int len = sizeof(a)/sizeof(int);
cout<<"数组的元素为:"<<endl;
for(int k=0; k<len; k++)
{
if(k==0)
{
cout<<a[k];
}
else
{
cout<<" "<<a[k];
}
}
cout<<endl;
Binsertsort(a,len);
return 0;
}