每插入一个数,插入排序移动的步数一定,想要优化算法,可以减少查询的步数,二分查找可以起到一定的优化。
//移的步数不变,查找的步数可能减少
#include <iostream>
#define MAXSIZE 100
using namespace std;
void insertion_sort(int a[],int n);
int binarySearch(int left,int right,int key,int a[]);
int main ()
{
int array[MAXSIZE];
int n,i;
while(cin>>n)
{
for(i=1;i<=n;i++)
cin>>array[i];
insertion_sort(array,n);
for(i=1;i<=n;i++)
cout<<array[i]<<" ";
cout<<endl;
}
return 0;
}
void insertion_sort(int a[],int n)
{
int i,j;
int key;
int position;
for(i=2;i<=n;i++)
{
key=a[i];
position=binarySearch(1,i-1,key,a);
//拆半查找
for(j=i-1;j>=position;j--)
//将position后面的数全部后移一位
{
a[j+1]=a[j];
}
a[position]=key;
}
}
int binarySearch(int left,int right,int key,int a[])
//二分查找a[i]
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(key<a[mid])
right=mid-1;
else
left=mid+1;
}
return left;
//当rigth比left小时,如12 13 4插入4时rigth=mid-1=0,而left=1,此时返回left
}