插入排序
算法思想:将待排序的数据放在一个数组中,并设置一个中间量m,用来存储每次插入比较的元素。
(1) a[1]自成1个有序区,无序区为a[2..n];
(2) 从i=2起直至i=n为止,将a[i]放在恰当的位置,使a[1..i]数据序列有序;
① m:=a[i];
② 将m与前i-1个数比较 , j:=i-1; while(x
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int main()
{
int n,a[1000],i,j,k,m;
cin>>n;
memset(a,0,sizeof(a));
for (i=1;i<=n;i++)cin>>a[i]; //输入
for (i=2;i<=n;i++)
{
m=a[i]; //m作为一个传递的中间量,每次将他赋值成这次要插入比较的元素
j=i-1; //j控制无序区
while (m<a[j]) //寻找a[i]的插入位置
{
a[j+1]=a[j]; //将大于a[i]的元素向后移
j--; //指针向后
}
a[j+1]=m; //将a[i]插入有序区
}
for (i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
关于复杂度:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。
最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。
最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上 (n-1)次
。平均来说插入排序算法的时间复杂度为O(n^2)。
因而,插入排序不适合对于数据量比较大的排序应用。
但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
关于稳定性:入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
一步一步算法篇
时间: 2024-12-13 10:33:38