算法设计与分析(第五篇)(分治与递归)归并排序C++

#include<iostream>
#include<vector>
using namespace std;

void Merge(vector<int>& array, int l, int r, int mid, vector<int>& result);
void MergeSort(vector<int>& array, int l, int r,vector<int>& result);

int main()
{
	int i,j,a;
	vector<int>array;
	vector<int>result;
	while(scanf("%d",&a))   //按ctrl+z结束输入
	{
		array.push_back(a);
		result.push_back(0);
	}
	MergeSort(array,0,array.size()-1,result);
	for(i=0;i<result.size();i++)
	{
		if(i<result.size()-1)
			cout<<result[i]<<" ";
		else
			cout<<result[i]<<endl; 
	}
	return 0;
 } 
 
 void Merge(vector<int>& array, int l, int r, int mid, vector<int>& result)
{
	int i=l,j=mid+1,k;
	for(k=l;(i<=mid)&&(j<=r);k++)
	{
		if(array[i]<array[j])
		{
			result[k]=array[i];
			i++;
			
		}
		else
		{
			result[k]=array[j];
			j++;
		}
	}
	while(i<=mid)
		result[k++]=array[i++];
	while(j<=r)
		result[k++]=array[j++];
 } 
void MergeSort(vector<int>& array, int l, int r,vector<int>&result)
{
	int temp;
	int mid=(l+r)/2; 
	if(l==r)  //只有一个元素 
	{
		result[l]=array[l];
		return; 
	}
	else if(l+1==r)   //如果区间中只有两个元素,则对这两个元素进行排序
	{
		if(array[l]>array[r])
		{
			temp=array[l];
			array[l]=array[r];
			array[r]=temp;
		}
		return;
	} 
	else
	{
		MergeSort(array,l,mid,result);
		MergeSort(array,mid+1,r,result);
		Merge(array,l,r,mid,result);
		for(int i=l;i<=r;i++)
			array[i]=result[i];   //将排序后的数据复制回原始数据中去,这步非常重要 
	}
}

好长时间没写算法题了,今天一个归并排序竟然没跑出来,忘记写回原数组了,在这里记一下,大家千万也要注意这一点,否则都不知道哪里有问题。

猜你喜欢

转载自blog.csdn.net/weixin_39359584/article/details/88423304