歸併排序的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)運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章