折半插入排序是对直接插入排序的改进,可以这么说,折半插入排序=直接插入排序+二分查找,代码如下。
#include<bits/stdc++.h>
using namespace std;
void insetSort(int a[],int n){
int l,r,m;
for(int i=2;i<=n;i++){
a[0]=a[i];
l=1;
r=i-1;
while(l<=r){///注意和二分查找while循环的区别
m=(l+r)/2;
if(a[m]>a[0]) r = m-1;
else l = m+1;
}
///等价于下面的while循环
/*
while(l<=r){
m=(l+r)/2;
if(a[m]>a[0]) r = m-1;
else if(a[m]<a[0]) l = m+1;
else {
r=m-1;break;
}
}
*/
///注意 l = r + 1; l或者r+1是要插入的位置
for(int j=i-1;j>=r+1;j--) a[j+1]=a[j];
a[r+1]=a[0];
}
}
int main(){
int n,a[100];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
insetSort(a,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
}