直接插入排序(Straight Insertion Sort)的核心思想是:从只包含1个元素的有序序列开始,不断地将待排序数据元素有序的插入到这个有序序列合适的位置中,直到有序列表包含了所有待排序数据元素为止 。
例子: 对于 3,1,5,7,2,4,9,6
0.初始状态 3,1,5,7,2,4,9,6(共8个数)
有序表:3;无序表:1,5,7,2,4,9,6
1.第一次循环,从无序表中取出第一个数 1,把它插入到有序表中,使新的数列依旧有序
有序表:1,3;无序表:5,7,2,4,9,6
2.第二次循环,从无序表中取出第一个数 5,把它插入到有序表中,使新的数列依旧有序
有序表:1,3,5;无序表:7,2,4,9,6
3.第三次循环,从无序表中取出第一个数 7,把它插入到有序表中,使新的数列依旧有序
有序表:1,3,5,7;无序表:2,4,9,6
4.第四次循环,从无序表中取出第一个数 2,把它插入到有序表中,使新的数列依旧有序
有序表:1,2,3,5,7;无序表:4,9,6
5.第五次循环,从无序表中取出第一个数 4,把它插入到有序表中,使新的数列依旧有序
有序表:1,2,3,4,5,7;无序表:9,6
6.第六次循环,从无序表中取出第一个数 9,把它插入到有序表中,使新的数列依旧有序
有序表:1,2,3,4,5,7,9;无序表:6
7.第七次循环,从无序表中取出第一个数 6,把它插入到有序表中,使新的数列依旧有序
有序表:1,2,3,4,5,6,7,9;无序表:(空)
直接插入排序是稳定的,算法时间复杂度平均、最坏都是O(n²) ,最好O(n),空间复杂度都是O(1);
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn =100001;
int a[maxn];
void InsertSort(int a[],int N)
{
int i,j;
for(i=1;i<N;i++)
{
int temp=a[i];
for(j=i-1;j>=0&&temp<a[j];j--)
a[j+1]=a[j]; //将较大元素后移
a[j+1]=temp; //temp插入正确的位置
}
}
int main()
{
int n;
cout<<"输入序列长度:"<<endl;
cin>>n;
cout<<"输入序列元素:"<<endl;
for(int i=0;i<n;i++)
cin>>a[i];
InsertSort(a,n);
cout<<"输出序列元素:"<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
运行结果: