归并排序

实现思想

先将所有的记录完全分开,然后两两合并,在合并的过程中排序,最终能够得到一个完整的有序表。
例如对于含有n个记录的有序表,首先认为表中每个记录各为一个有序表,然后进行两两合并,使n个有序表变为n/2(向上取整)个长度为2或者1的有序表,通过不断的进行两两合并,最终得到一个长度为n的有序表。这种归并排序方法称为:2-路归并排序。
在这里插入图片描述

实现代码

#include <stdio.h>
#include <stdlib.h>

#define MAX 7

void Merge(int src[], int dest[], int start, int middle, int end) 
{
	int j, k;
	for (j = middle + 1, k = start; start <= middle && j <= end; k++) {
		if (src[start] < src[j])
			dest[k] = src[start++];
		else
			dest[k] = src[j++];
	}
	while (start<=middle) {
		dest[k++] = src[start++];
	}
	while (j<=end) {
		dest[k++] = src[j++];
	}
}

void MSort(int src[], int dest[], int start, int end) {
	int dest2[MAX];
	if (start == end) {
		dest[start] = src[start];
	}
	else {
		int middle = (start + end) / 2;
		MSort(src, dest2, start, middle);
		MSort(src, dest2, middle + 1, end);
		Merge(dest2, dest, start, middle, end);
	}
}

int main(int argc, char* argv[]) 
{
	int arr[] = {49, 38, 65, 97, 76, 13, 27};
	int len = sizeof(arr) / sizeof(int);
	MSort(arr, arr, 0, len-1);
	for (int i = 0; i < len;i++) {
		printf("%d, ", arr[i]);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值