码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2017-09-27 20:39:28      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:while   数组   for   下标   一个   return   eof   合并   std   

//归并边界:分治到最后的一半只剩一个值
//复杂度nlgn==2^k * T(n/2^k)+k*a*n当n/2^k==1时算得k得Tn

#include<iostream>
using namespace std;

int a[10]={13,27,19,2,8,12,2,8,30,89};
int b[10];//跟a一样大的数组,用于存放排序过程中的中间结果

void merge(int a[],int s,int m,int e,int tmp[])
{
	//将要排序的两半合并到tmp中,然后再拷贝到a[s,m]中
	//归并的时间复杂度O(e-m+1)==O(N)
	int pb=0;
	int p1=s,p2=m+1;//两个指针,分别指向前一半和后一半的开始位置

	//归并前两部分都是有序的噢
	while(p1<=m&&p2<=e)//都没有走到头
	{
		if(a[p1]<a[p2])
		{
			tmp[pb++]=a[p1++];
		}
		else
		{
			tmp[pb++]=a[p2++];
		}
	}

	while(p1<=m)
	{
		tmp[pb++]=a[p1++];
	}

	while(p2<=e)
	{
		tmp[pb++]=a[p2++];
	}

	for(int i=0;i<e-s+1;i++)
	{

		a[s+i]=tmp[i];
	}
}


void MergeSort(int a[],int s,int e,int tmp[])
{
	if(s<e)//边界s=e直接返回,此处没写
	{
		int m=s+(e-s)/2;//找中点,前后可能元素个数差一个,无碍
		MergeSort(a,s,m,tmp);//前一半归并
		MergeSort(a,m+1,e,tmp);//后一半归并
		merge(a,s,m,e,tmp);//分别归并后再合并到一起,temp是归并过程中用到额外的存储空间
	}
}


int main()
{
	int size=sizeof(a)/sizeof(int);//算一下多少个元素要排序

	MergeSort(a,0,size-1,b);//并不一定排整个数组,可以排连续的一段,参数2-起始下标和参数3-终止下标

	for(int i=0;i<size;i++)
		cout<<a[i]<<",";

	cout<<endl;
	return 0;
}

 

归并排序

标签:while   数组   for   下标   一个   return   eof   合并   std   

原文地址:http://www.cnblogs.com/dusanlang/p/7603398.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!