三大排序之归并排序

归并排序的思想集中体现在:归和并上。归是指使用递归(分治)的思想,并是指分到最小单元的时候,开始合并。

废话不多说,直接贴代码,有问题欢迎评论讨论。

代码如下,经验证和冒泡排序结果一致。

#include<iostream>
using namespace std;
#define N 12
//并
void Merge(int *a,int left,int middle,int right)
{
	int i=left;
	int j=middle+1;
	int k=0;
	int *tmp = new int[right - left +1];
	while(i <= middle && j<= right)
	{
		if(a[i] < a[j])
		{
			tmp[k++]=a[i++];
		}
		else
		{
			tmp[k++]=a[j++];
		}
	}
	while(i<=middle)
	{
		tmp[k++] = a[i++];
	}
	while(j<= right)
	{
		tmp[k++] = a[j++];
	}
	for(int m=0,n=left;m<right - left +1;m++,n++)
	{
		a[n] = tmp[m];
	}
	delete[] tmp;
}
//归
void MergeSort(int *a,int left,int right)
{
	if(left == right)
		return;
	int middle = left + ((right - left)>>1);
	MergeSort(a,left,middle);
	MergeSort(a,middle+1,right);
	Merge(a,left,middle,right);	
}

void BubbleSort(int *a, int length)
{
	for(int i=length-1;i>=0;i--)
	{
		for(int j=0;j+1<i;j++)
		{
			if(a[j]>a[j+1])
			{
				int swap=a[j+1];
				a[j+1] = a[j];
				a[j] = swap;
			}
		}
	}
}

void ArrayCopy(int *a, int *b, int length)
{
	for(int i=0;i<length;i++)
	{
		b[i] = a[i];
	}
}

void printArray(int *a, int length)
{
	for(int i=0;i<length;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
}
int main()
{
	int input[N]={5,4,3,2,1,7,9,8,0,11,15,21};
	int cinput[N]={0},cinput2[N]={0},cinput3[N]={0};
	ArrayCopy(input,cinput,N);
	MergeSort(input,0,N-1);
	BubbleSort(cinput,N);
	printArray(input,N);
	printArray(cinput,N);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/u014228447/article/details/80624912
今日推荐