基本概念:
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,
算法分析:
依次将每个记录插入到一个有序中去。就是说,第i遍整理时, A 1 , A 2 , . . . , A i − 1 A1,A2,...,Ai-1 A1,A2,...,Ai−1已经是排好序的序列;取出第i个元素 A i Ai Ai,在已排好的序列为 A i Ai Ai找到一个合适的位置,并将它插到该位置上。易知上述排序当i=1时实际上为空操作,故可直接从i=2开始。
复杂度分析:
空间效率:仅用了一个辅助单元。
最差复杂度:当输入数组为倒序时,复杂度为
O
(
n
2
)
O(n^2)
O(n2)
最优复杂度:当输入数组就是排好序的时候,复杂度为
O
(
n
)
O(n)
O(n)
直接插入排序的时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。是一个稳定的排序方法。
插入排序比较适合用于“少量元素的数组”。
#include<bits/stdc++.h>
using namespace std;
int d(int a[],int x,int num) //查找数num在长度为x的a数组中的插入位置
{
int l=1,r=x,mid=0;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]>num) r=mid-1;
else l=mid+1;
}
if(a[mid]<=num) mid++;
return mid;
}
void f(int a[],int n)
{
int i,j,temp;
for(i=2; i<=n; i++) //从第2个数开始插入
{
int mid=d(a,i,a[i]);
if(i!=mid) //插入位置不为i,才插入
{
j=i;
temp=a[i];
while(j>mid)
{
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
}
}
int main()
{
int n,a[100010],i;
scanf("%d",&n);
for(i=1; i<=n; i++) scanf("%d",&a[i]);
f(a,n);
for(i=1; i<=n; i++) printf("%d ",a[i]);
return 0;
}