首页 > 代码库 > 二路归并排序

二路归并排序

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

以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--];
}


二路归并排序