折半插入排序
#include<iostream>
using namespace std;
//折半插入排序,关键字的比较次数由于采用了折半查找而减少,但元素的移动次数仍不变
const int Maxsize=10;
int list[Maxsize];
void binasort(int list[],int n)
{
int i,j,t,low,high,mid;
for(i=1;i<n;i++)
{
t=list[i];
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(t>=list[mid])low=mid+1; //而不是t>list[mid],确保排序是稳定的
else high=mid-1;
}
for(j=i;j>low;j--)list[j]=list[j-1];
list[low]=t;
}
}
void main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)cin>>list[i];
binasort(list,n);
for(i=0;i<n;i++)cout<<list[i]<<" ";cout<<endl;
}
#include<iostream>
#include<string>
using namespace std;
//折半插入排序,关键字的比较次数由于采用了折半查找而减少,但元素的移动次数仍不变
const int Maxsize=10;
struct data
{
int a;
string name;
};
data list[Maxsize];
void binasort(data list[],int n)
{
int i,j,t,low,high,mid;string str;
for(i=1;i<n;i++)
{
t=list[i].a;str=list[i].name;
low=0;high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(t>=list[mid].a)low=mid+1; //而不是t>list[mid]确保排序是稳定的
else high=mid-1;
}
for(j=i;j>low;j--){list[j].a=list[j-1].a;list[j].name=list[j-1].name;}
list[low].a=t;list[low].name=str;
}
}
void main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)cin>>list[i].a>>list[i].name;
binasort(list,n);
for(i=0;i<n;i++)cout<<list[i].a<<" "<<list[i].name<<endl;
}
/*
5
55 55name
22 22name
44 44name
11 11name
33 33name
11 11name
22 22name
33 33name
44 44name
55 55name
请按任意键继续. . .
*/