第二章之“合并排序中对小数组采用插入排序”(思考题2-1)

虽然插入排序的时间复杂度为O(n^2),合并排序的时间复杂度为O(nlgn),但是当子问题规模很小时,插入排序的效率要比合并排序高,所以,可以将合并排序和插入排序进行组合,当合并排序的子数组小到一定程度时,不再进行划分,而是改变算法,用插入排序算法对其进行排序。

#include 
#include 
#include 

#define BUFFER_SIZE 10

int InsertionSort(int *a,int p,int q)
{
	int i=0;
	int j=0;
	int b[q-p+1];
	memset(b,0,sizeof(b));
	b[0]=a[p];
	
	for(i=p+1;i<=q;i++)
	{
		j=i-p-1;
		while(j>=0&&b[j]>=a[i])
		{
			b[j+1]=b[j];
	        j--;
		}
		b[j+1]=a[i];
	}
	for(i=p,j=0;i<=q;i++)
	{
		a[i]=b[j];
		j++;
	}
}

void Merge(int *a,int p,int q,int r)
{
	int n1=q-p+1;
	int n2=r-q;
	int i=0;
	int j=0;
	int k=0;
	int b[n1+1];
	int c[n2+1];
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	b[n1]=BUFFER_SIZE;//设置哨兵元素,注意不要溢出
	c[n2]=BUFFER_SIZE;//设置哨兵元素,注意不要溢出

	
	for(i=0;i=r)
	{
		return;
	}
	
	q=(p+r)/2;
	if((q-p+1)<=k)//子数组长度≤k的时候就不再进行划分,而是对该子数组进行插入排序 
	{
		InsertionSort(a,p,q);
	}
	else 
	{
		MergeAndInsertionSort(a,p,q,k);
	}
	
	if(r-q<=k)
	{
		InsertionSort(a,q+1,r);
	}
	else
	{
		MergeAndInsertionSort(a,q+1,r,k);
	}
	
	Merge(a,p,q,r);
}

void Output(int *a,int len)
{
	int i=0;
	
	for(i=0;i


你可能感兴趣的:(第二章之“合并排序中对小数组采用插入排序”(思考题2-1))