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、输出结果