归并排序(分治)

算法思想:

    将数组前一半排序,再将数组后一半排序,最终将排序好的数组都归并到一类


#include <iostream>

using namespace std;

void Merge(int *s1, int *s2,int start,int middle, int end)
{
	int p1 = start, p2 = middle+1, ret = 0;
	
	while( p1 <= middle && p2 <= end )		//s1[start,middle],s2[middle+1,end]归并至s2 
	{
		if( s1[p1] <= s1[p2] )
			s2[ret++] = s1[p1++];
		else
			s2[ret++] = s1[p2++];
	}
	while( p1 <= middle )
		s2[ret++] = s1[p1++];
	while( p2 <= end)
		s2[ret++] = s1[p2++];
	for(int i = 0; i < end-start + 1; ++i)	//s2数组内容拷贝回s1 
		s1[start + i] = s2[i];
}

void MergeSort(int *s1, int *s2, int start, int end)
{
	if(start < end)
	{
		int middle = start + (end - start)/2;
		MergeSort(s1, s2, start, middle);		//分成左右两半进行归并排序 
		MergeSort(s1, s2, middle+1, end);
		Merge(s1, s2, start, middle, end);		//合并成同一个数组 
	}
}


int main()
{
	int number;
	cin >> number;
	int *s1 = new int[number];
	int *s2 = new int[number];
	for(int i = 0; i < number; ++i)
		cin >> s1[i];
	MergeSort(s1,s2,0,number-1);
	delete []s2;
	for(int i = 0; i < number; ++i)
		cout << s1[i] << " ";
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/80204662