【C/C++ 04】归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,也是用空间换时间思维的体现。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

  • 排序对象:数组、链表
  • 时间复杂度:O(n * \log n)
  • 空间复杂度:O(n)
  • 是否稳定:是

【C/C++ 04】归并排序_第1张图片

void _MergeSort(int* arr, int begin, int end, int* tmp)
{
	if (begin >= end)
		return;

	// 递归,先将数组无限分割,直到每个子数列的长度小于等于2
	int mid = (begin + end) / 2;
	_MergeSort(arr, begin, mid, tmp);
	_MergeSort(arr, mid + 1, end, tmp);

	int leftBegin = begin;
	int leftEnd = mid;
	int rightBegin = mid + 1;
	int rightEnd = end;

	int pos = begin;
	while (leftBegin <= leftEnd && rightBegin <= rightEnd)
	{
		// 从前往后同步遍历两个子数列,将相对较小的值先写入tmp中
		if (arr[leftBegin] < arr[rightBegin])
			tmp[pos++] = arr[leftBegin++];
		else
			tmp[pos++] = arr[rightBegin++];
	}

	// 将还没遍历完的子数列的值一次性写入tmp中
	while (leftBegin <= leftEnd)
	{
		tmp[pos++] = arr[leftBegin++];
	}
	while (rightBegin <= rightEnd)
	{
		tmp[pos++] = arr[rightBegin++];
	}

	// 内存数据copy,将临时存储有序子数列的tmp数组的值写入arr对应位置
	memcpy(arr + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}

void MergeSort(int* arr, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	_MergeSort(arr, 0, n - 1, tmp);
	free(tmp);
	tmp = NULL;
}


 

你可能感兴趣的:(C/C++,c语言,c++,算法)