基本思想:以第一个记录为界,将整个记录序列分成两部分进行处理。将不小于第一个记录的所有记录用折半插入的方式插入左路的序列序列中,将小于第一个序列的记录插入用折半插入的方法插入到右路的序列中。final为左路最后一个元素,first为右路第一个元素。
空间复杂度O(n),时间复杂度O(n^2),这是稳定的排序方法
//2路插入排序
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void TwoInsertSort(int a[],int n)
{
int d[n+1];
memset(d,0,sizeof(d));
int final,first,low,high,mid;
d[1]=a[1];
final=1,first=n+1;
for(int i=2;i<=n;i++)
{
if(a[i]>=d[1])
{
low=1,high=final;
while(low<=high)
{
mid=(low+high)/2;
if(a[i]<d[mid]) high=mid-1;
else low=mid+1;
}
for(int j=final;j>=low;j--)
d[j+1]=d[j];
d[low]=a[i];
final++;
}
else
{
low=first,high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[i]<d[mid]) high=mid-1;
else low =mid+1;
}
for(int j=first;j<=high;j++)
d[j-1]=d[j];
d[high]=a[i];
first--;
}
}
int k=1;
for(int i=first;i<=n;i++)
a[k++]=d[i];
for(int i=1;i<=final;i++)
a[k++]=d[i];
}
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
TwoInsertSort(a,n);
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}