二分法排序
算法思想简单描述:
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。
二分法没有排序,只有查找。所以当找到要插入的位置时。移动必须从最后一个记录开始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位。
二分插入排序是稳定的,平均时间O(n2)
#include <iostream>
using namespace std;
void BinarySearch(int a[], int len)
{
int i;
int first;
int last;
int iSave;
for(i=1; i<len; i++)
{
first = 0;
last = i - 1;
iSave = a[i];
while(first <= last)
{
if(a[i] >= a[(first + last)/2])
{
first = (first + last)/2 + 1;
}
else
{
last = (first + last)/2 - 1;
}
}
for(int j=i-1; j>=first; j--)
{
/* 将排序码大于ki的记录后移 */
a[j+1] = a[j];
}
a[first] = iSave;
}
}
void print(int A[], int len)
{
int i=0;
for(i=0; i<len; i++)
cout << A[i] << " ";
cout<<endl;
}
int main()
{
int A[15]={12,3,4,6,98,123,3,56,78,11,65,455,324,0,1};
int iS = sizeof(A)/sizeof(A[0]);
print(A, iS);
BinarySearch(A, iS);
print(A, iS);
}