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)運行結果