MergeSort

/*******************************************************************************

归并排序(Merge Sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并操作的工作原理如下:
1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置。
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
4.重复步骤3直到某一指针达到序列尾。
5.将另一序列剩下的所有元素直接复制到合并序列尾。

归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作(merge),形成floor(n / 2)个序列,排序后每个序列包含两个元素。
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素。
3.重复步骤2,直到所有元素排序完毕。

比较操作的次数介于 (nlogn)/2 和 nlogn - n + 1。 赋值操作的次数是(2nlogn)。 归并算法的空间复杂度为:Θ(n)

************************************************************************
void Merge(int array[], int first, int mid, int last)
{
	int i, j = 0;
	int begin1 = first, end1 = mid, begin2 = mid + 1, end2 = last;
	int *temp = (int *)malloc((last - first + 1) * sizeof(int));
	if (!temp)
	{
		fprintf(stderr, "\n内存分配失败,程序将强制退出!\n");
		getch();
		exit(1);
	}
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (array[begin1] < array[begin2])
		{
			temp[j++] = array[begin1];  begin1++;
		}
		else
		{
			temp[j++] = array[begin2];  begin2++;
		}
	}
    while (begin1 <= end1)
	{
		temp[j++] = array[begin1++];
	}
	while(begin2 <= end2)
	{
		temp[j++] = array[begin2++];
	}
	for (i = 0; i < (last - first + 1); i++)
	{
		array[first + i] = temp[i];
	}
	free(temp);
}

void _MergeSort(int *array, int first, int last)
{
	int mid;
	if (first < last)
	{
		mid = (first + last) / 2;
		_MergeSort(array, first, mid);
		_MergeSort(array, mid + 1, last);
		Merge(array, first, mid, last);
	}
}

void MergeSort(int *array, int length)
{
	_MergeSort(array, 0, length - 1);
}

*/

这个代码花费了我一个晚上,哈哈,还是不够熟练啊,完全没有头绪,想了好久,现在连时间性能也没能很好的理解。
这个排序算法使用了分治的策略,
1)分解
2)解决
3)合并
三步,分解成小步,有时解决和合并时一起进行的,归并排序就是这样。
思路为:通过递归把一组数不断分解,通过某个条件退出递归的嵌套,执行解决排序合并

猜你喜欢

转载自blog.csdn.net/qq_38960899/article/details/78267197