【C】排序算法之归并排序

1、算法基本思想

递归实现:先分后合。

迭代实现:先合2个,后合4个,再合8个...

2、源代码

交换数据

/*
*	函数名称:Swap
*
*	函数功能:交换数据
*
*	入口参数:a, b
*
*	出口参数:void
*
*	返回类型:void
*/

void Swap(int * a, int * b)
{
	int tmp = 0;
	
	assert(NULL != a);
	assert(NULL != b);

	tmp = *a;
	*a = *b;
	*b = tmp;

	return;
}

合并

/*
*	函数名称:Merge
*
*	函数功能:合并
*
*	入口参数:array, left, mid, right, extra
*
*	出口参数:void
*
*	返回类型:void
*/

void Merge(int array[], int left, int mid, int right, int extra[])
{
	int ileft = left;
	int iright = mid;
	int iextra = left;
	int i = 0;

	for (ileft = left, iright = mid; ileft < mid && iright <= right; iextra++) 
	{
		// 等于使得合并稳定
		if (array[ileft] <= array[iright])
		{
			// 左边序列元素小于等于右边序列元素,搬运至extra中
			extra[iextra] = array[ileft++];
		}
		else 
		{
			extra[iextra] = array[iright++];
		}
	}

	// 剩余没有搬运完的元素
	while (ileft < mid) 
	{
		// 将左边剩余元素搬进extra中
		extra[iextra++] = array[ileft++];
	}

	while (iright <= right) 
	{
		// 将右边剩余元素搬进extra中
		extra[iextra++] = array[iright++];
	}

	// 将extra数组中排好序的元素复制到array数组
	for (i = left; i <= right; i++) 
	{
		array[i] = extra[i];
	}

	return;
}

归并排序之递归

/*
*	函数名称:MergeSortRecursion
*
*	函数功能:归并排序(递归)
*
*	入口参数:array, left, right, extra
*
*	出口参数:void
*
*	返回类型:void
*/

void MergeSortRecursion(int array[], int left, int right, int extra[])
{
	int mid = 0;

	if (left >= right) 
	{
		return;
	}
	else
	{
		mid = (left & right) + ((left ^ right) >> 1);
		// [left, mid]
		MergeSortRecursion(array, left, mid, extra);
		// [mid + 1, right]
		MergeSortRecursion(array, mid + 1, right, extra);

		Merge(array, left, mid + 1, right, extra);
	}

	return;
}

归并排序之迭代

/*
*	函数名称:MergeSortLoop
*
*	函数功能:归并排序(迭代)
*
*	入口参数:array, size, extra
*
*	出口参数:void
*
*	返回类型:void
*/

void MergeSortLoop(int array[], int size, int extra[])
{
	int gap = 0;
	int i = 0;	
	// 表示需要合并多少层
	for (gap = 1; gap < size; gap = 2 * gap)
	{
		// 每层需要合并多少次
		for (i = 0; i < size; i += 2 * gap) 
		{
			int left = i;
			int mid = i + gap;
			int right = mid + gap - 1;

			if (mid >= size) 
			{
				break;
			}
			else
			{
				;
			}

			if (right >= size) 
			{
				right = size - 1;
			}
			else
			{
				;
			}

			Merge(array, left, mid, right, extra);
		}
	}
}

归并排序

/*
*	函数名称:MergeSort
*
*	函数功能:归并排序
*
*	入口参数:array, size
*
*	出口参数:void
*
*	返回类型:void
*/

void MergeSort(int array[], int size)
{
	int * extra = (int *)malloc(sizeof(int) * size);

	assert(NULL != extra);

	//MergeSortRecursion(array, 0, size - 1, extra);
	MergeSortLoop(array, size, extra);

	free(extra);

	return;
}

main

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:MergeSort.c
* 功能:归并排序
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年7月10日09:26:37
*/

# include <stdio.h>
# include <assert.h>

/*
*	函数名称:main
*
*	函数功能:测试主程序
*
*	入口参数:void
*
*	出口参数:0
*
*	返回类型:int 
*/

int main(void)
{
	int i = 0;
	int numbers[] = {3, 1, 6, 4, 5, 2};
	int len = sizeof(numbers) / sizeof(int);

	printf("排序之前:\n");

	for (i = 0; i < len; i++)
	{
		printf("%d ", numbers[i]);
	}

	MergeSort(numbers, len);

	printf("\n排序之后:\n");

	for (i = 0; i < len; i++)
	{
		printf("%d ", numbers[i]);
	}

	printf("\n");

	return 0;
}

3、输出结果

猜你喜欢

转载自blog.csdn.net/sustzc/article/details/81055762