归并排序的C/C++实现及讲解

1.基本原理
取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,他们初始置于对应数组的开始端。A[Aptr]和B[Bptr]中较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中。
一个具体的合并例程如下:(摘自《数据结构与算法分析》Mark Allen Weiss 著)
在这里插入图片描述
在这里插入图片描述
在归并算法中,如果只有一个元素,那么只有一个元素需要排序,直接得到结果。否则递归的将前半部分和后半部分数据各自归并排序,得到排序后的两部分数据,然后使用上面描述的合并算法再将这两部分合并到一起。

2.实现代码
如下为实现归并排序的例程:
(1)头文件MergeSort.h

#ifndef _MERGESORT_H
#define _MERGESORT_H

typedef int ElementType;

void Merge(ElementType A[], ElementType TmpArray[], int left, int center, int right);//合并

void Msort(ElementType A[], ElementType TmpArray[], int left, int right);//递归函数

void MergeSort(ElementType A[], int N);//驱动程序



#endif

(2)源文件MergeSort.c

#include<stdio.h>
#include<malloc.h>
#include"MergeSort.h"


void MergeSort(ElementType A[], int N)//驱动程序
{
	ElementType* TmpArray;
	TmpArray = malloc(sizeof(ElementType)*N);

	if (TmpArray != NULL)
	{
		Msort(A, TmpArray, 0, N - 1);
		free(TmpArray);
	}
	else
	{
		printf("out of space!!!\n");
		exit(1);
	}
		
}

void Merge(ElementType A[], ElementType TmpArray[], int leftStart, int rightStart, int rightEnd)//合并
{
	int lengthofarray = rightEnd - leftStart + 1;
	int leftEnd = rightStart - 1;
	int tmpPos = leftStart;

	while ((leftStart<=leftEnd)&&(rightStart<=rightEnd))
	{
		if (A[leftStart] < A[rightStart])
			TmpArray[tmpPos++] = A[leftStart++];
		else
			TmpArray[tmpPos++] = A[rightStart++];

	}

	while (leftStart <= leftEnd)//把左边剩余的全部拷贝到临时数组
	{
		TmpArray[tmpPos++] = A[leftStart++];
	}

	while (rightStart <= rightEnd)//把右边剩余的全部拷贝到临时数组
	{
		TmpArray[tmpPos++] = A[rightStart++];
	}

	//for (int i = leftStart; i <= rightEnd; i++)
	//	A[i] = TmpArray[i];
	for (int i = 0; i < lengthofarray; i++,rightEnd--)//把临时数组里面的数据拷贝回原数组
		A[rightEnd] = TmpArray[rightEnd];
}

void Msort(ElementType A[], ElementType TmpArray[], int left, int right)//递归函数
{
	int center;
	if (left < right)
	{
		center = (left + right) / 2;
		Msort(A, TmpArray, left, center);
		Msort(A, TmpArray, center + 1, right);
		Merge(A, TmpArray, left, center+1, right);
	}
}

(3)源文件main.c

/*******************************************************************************************************************
Function:归并排序
Date:2020/06/17
********************************************************************************************************************/

#include"MergeSort.h"

int main()
{
	ElementType A[10] = { 7,19,33,23,9,78,54,37,41,15 };
	MergeSort(A, 10);


	printf("the Array after sorting is:\n");
	for (int i = 0; i < 10; i++)
		printf("%d  ",A[i]);
	printf("\n");

	return 0;
}

(4)运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值