二分法排序

二分法排序

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

  

你可能感兴趣的