排序方法(四)归并排序(由上到下)

使用语言:c语言,编译器visual studio 2017
一.基本思想
从上到下的归并排序的基本思想主要分成三步。(1)分解:将序列大致分成长度相等的两部分,再运用递归使其越分越细,直到分成单个元素;(2)排序:根据大小关系将相邻两个元素排好序;(3)合并:将两个有序序列合成一个有序序列,直到合成完整的序列。
图例:
在这里插入图片描述
二.代码实现

#include<stdio.h>
#include<malloc.h>
void Merge(int array[],int start,int mid,int end) {//将array中两个有序部分合成一个
	int *temp = (int*)malloc((end - start + 1) * sizeof(int));
	int i = start;
	int j = mid + 1;
	int k = 0;
	while (i <= mid && j <= end) {
		if (array[i] <= array[j]) {
			temp[k++] = array[i++];
		}
		else {
			temp[k++] = array[j++];
		}
	}
	while (i <= mid) {
		temp[k++] = array[i++];
	}
	while (j <= end) {
		temp[k++] = array[j++];
	}
	for (i = 0; i < k; i++) {
		array[start + i] = temp[i];
	}
	free(temp);
}

void MergeSort(int array[], int start, int end) {//用于划分数组
	if (array == NULL || start >= end) return;
	int mid = (start + end) / 2;
	MergeSort(array, start, mid);//递归地划分左边的数组
	MergeSort(array, mid + 1, end);//递归地划分右边的数组
	Merge(array, start,mid, end);//将左右有序部分合成一个
}

int main() {
	int array[100];
	int i = 0;
	int num = 0;
	printf("请输入待排序的数字个数:\n");
	scanf_s("%d", &num);
	printf("请输入%d个数字:\n", num);
	for (i; i<num; i++) scanf_s("%d", &array[i]);
	int start = 0;
	int end = i - 1;
	MergeSort(array, start, end);
	printf("归并排序后的序列为:\n");
	for (i = 0; i < num; i++) {
		printf("%d ", array[i]);
		if (i == num - 1) {
			printf("\n");
		}
	}
	return 0;
}

三.时间复杂度分析
假设函数MergeSort需要时间T(N)。因为Merge()函数的时间复杂度为O(N),所以T(N)=2T(N/2)+O(N)。推导得时间复杂度均为O(NlogN)。或者这么理解:归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(N*logN)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值