码迷,mamicode.com
首页 > 其他好文 > 详细

二路归并排序

时间:2014-09-25 19:34:57      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:归并排序   递归   合并   算法   

“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。

以n个元素的数组为例:可以看作为n个有序的子表,每个子表的长度为1,然后两两合并,得到n/2个长度为2或1的有序子表。然后再两两合并......如此重复,直到合并为一个长度为n的有序表为止。

以下是用递归法实现的二路归并排序算法:

void MergeSort(int *a, int n)
{
	MergePart(a, 0, n - 1);
}

void MergePart(int *a, int low, int high)
{
	if (low < high){ //递归的终止条件
		int mid = (low + high) / 2;   //从中间划分两个子序列
		MergePart(a, low, mid);   //对左侧子序列进行递归排序
		MergePart(a, mid + 1, high);    //对右侧子序列进行递归排序
		Merge(a, low, mid, high);   //归并
	}
}

void Merge(int *a, int low, int mid, int high)
{
	int i = mid, j = high, k;
	for (k = low; k <= high; ++k) //将a中的元素复制到b中,b是一个辅助数组,可以设置为一个全局变量
		b[k] = a[k];
	k = high;
	//以b中mid为界,依次从左右两端有序元素中选择最大的元素放入a中
	while (i >= low && j > mid) 
		a[k--] = b[i] > b[j] ? b[i--] : b[j--];

	//以下这两个while只会执行一个
	//作用是将剩下的有序元素全部放入a中剩下的空间
	while (i >= low)
		a[k--] = b[i--];
	while (j > mid)
		a[k--] = b[j--];
}


二路归并排序

标签:归并排序   递归   合并   算法   

原文地址:http://blog.csdn.net/nyist327/article/details/39553627

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