二分法排序
算法思想简单描述:
在插入第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); }