排序演算法__折半插入排序

Enjoy_process發表於2019-03-06

                                              排序演算法__折半插入排序

 

 

 

一、介紹

由於插入排序的基本操作是在一個有序表中進行查詢和插入,這個查詢操作可利用“折半查詢”來實現,由此進行的插入排序稱之為折半插入排序。

 

二、C++實現

#include<iostream>

using namespace std;

void binSearch(int a[],int n)
{
	for(int i=1;i<n;i++)//將元素a[i]插入到有序區間[0,i)中 
	{
		//使用二分法查詢a[i]應該插入的位置
		int l=0,r=i,t=a[i];
		while(l<r)
		{
			int mid=(l+r)>>1;
			if(t<a[mid])
			  r=mid;
			else
			  l=mid+1;
		}
		//l是第一個大於a[i]的數,也就是說a[i]的位置就該為 l (特殊時l=i) 
		for(int j=i-1;j>=l;j--) a[j+1]=a[j];//記錄後移
		a[l]=t;//元素a[i]的插入位置為l 
	}
} 

int main()
{
	int a[10]={1,34,2,67,4,6,90,223,12,456};
	printf("排序前:"); 
	for(int i=0;i<10;i++)
	  printf("%d ",a[i]);
	binSearch(a,10);
	printf("\n排序後:");
	for(int i=0;i<10;i++)
	  printf("%d ",a[i]);
	return 0;
}

三、時間複雜度

折半插入排序和直接插入排序相比,僅減少了關鍵字間的比較次數,而記錄的移動次數不變,因此折半插入排序的時間複雜度仍為O(n^{2})

相關文章