GreensnoWorld
记录点滴,分享乐趣,一块凝固的时间
0060.归并排序(Merging Sort)递归&非递归算法C语言实例
数据结构与算法  2021年6月15日
#include <stdio.h>
#include <stdlib.h>

#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXSIZE 20

typedef int Status;
typedef int KeyType;
typedef int InfoType;
typedef struct {
	KeyType key;
	InfoType otherinfo;
}RcdType;
typedef struct {
	RcdType r[MAXSIZE+1];
	int length;
}SqList;

void ListInsert(SqList *L)
{
	int i, n;
	
	printf("Input number of key: ");
	scanf("%d", &n);
	if(n>MAXSIZE)
		exit(ERROR);

	L->r[0].key = 0;
	L->length = 0;
	for(i=1; i<=n; i++)
	{
		printf("Input key: ");
		scanf("%d", &L->r[i]);
		L->length++;
	}
}

void ListTraverse(SqList L)
{
	int i;
	for(i=1; i<=L.length; i++)
		printf("%d ", L.r[i].key);
	printf("\n");
}

Status LQ(KeyType m, KeyType n)
{
	if(m <= n)
		return TURE;
	else
		return FALSE;
}

void Merge(RcdType SR[], RcdType TR[], int i, int m, int n)
{
	int j, k;
	for(j=m+1, k=i; i<=m && j<=n; k++)
	{
		if(LQ(SR[i].key, SR[j].key))
			TR[k] = SR[i++];
		else
			TR[k] = SR[j++];
	}
	while(i<=m)
		TR[k++] = SR[i++];
	while(j<=n)
		TR[k++] = SR[j++];
}

void MSort(RcdType SR[], RcdType TR1[], int s, int t)
{
	int m;
	RcdType TR2[s+t];

	if(s==t)
		TR1[s] = SR[s];
	else
	{
		m = (s+t)/2;
		MSort(SR, TR2, s, m);
		MSort(SR, TR2, m+1, t);
		Merge(TR2, TR1, s, m, t);
	}
}

void MergeSort(SqList *L)
{
	MSort(L->r, L->r, 1, L->length);
}

void MergePass(RcdType SR[], RcdType TR[], int l, int n)
{
	int i;
	for(i=1; i+2*l-1<=n; i+=2*l)
		Merge(SR, TR, i, i+l-1, i+2*l-1);
	if(i+l-1 < n)
		Merge(SR, TR, i, i+l-1, n);
	else
		while(i <= n)
		{
			TR[i] = SR[i];
			i++;
		}
}

void MergeSortNR(SqList *L)
{
	int l, n=L->length;
	RcdType TR[n+1];

	for(l=1; l<n; l*=2)
	{
		MergePass(L->r, TR, l, n);
		l *= 2;
		MergePass(TR, L->r, l, n);
	}
}

void main()
{
	SqList L;
	
	ListInsert(&L);
	MergeSort(&L);
	ListTraverse(L);

	ListInsert(&L);
	MergeSortNR(&L);
	ListTraverse(L);
}
LIJG
余本顽劣,生于紫云下,长于汝水滨。早年求学,兴趣广泛,好高骛远,学无所成,仓皇入世。兴趣所致,投身互联网,求知未证,而立已至,始悟光阴荏苒,终需务实钻研。故有此站,记录时光,积累点滴,验证所学,分享愚见。指舞方寸间,心系万千年。
留言