归并排序----附图解(C语言)

目录

一、简介

二、代码部分

2.1完整代码

2.2代码运行结果

 三、代码思路(附图解)

四、总结 

归并排序的优缺点

一、简介

中文名:归并排序

英文名:Merge Sort

时间复杂度:O(n log n)

稳定性:稳定的排序算法

原理:归并排序是采的的分治法为核心的一个非常典型的排序算法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

二、代码部分

2.1完整代码

#include
#include

void Merge(int* num, int start, int middle, int end);
void MergeSort_UptoDown(int* arr, int start, int end);

int main()
{
	int arr[10] = { 7, 0, 9, 4, 5, 2, 3, 8, 1, 6 };
	int length = sizeof(arr) / sizeof(arr[0]), i;

	printf("排列前:");
	for (i = 0; i < length; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");

	MergeSort_UptoDown(arr, 0, length - 1);

	printf("排列后:");
	for (i = 0; i < length; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n\n");

	return 0;
}

void MergeSort_UptoDown(int* arr, int start, int end) // 将序列对半拆分直到序列长度为1,停止
{
	int middle = start + (end - start) / 2;

	if (start >= end)
	{
		return;
	}

	MergeSort_UptoDown(arr, start, middle);
	MergeSort_UptoDown(arr, middle + 1, end);

	Merge(arr, start, middle, end);
}

void Merge(int* arr, int start, int middle, int end)
{
	int* temp = (int*)malloc((end - start + 1) * sizeof(int));    //申请空间来存放两个有序区归并后的临时区域
	int i = start;
	int j = middle + 1;
	int k = 0;

	while (i <= middle && j <= end)
	{
		if (arr[i] <= arr[j])
		{
			temp[k++] = arr[i++];
		}
		else
		{
			temp[k++] = arr[j++];
		}
	}

	while (i <= middle)
	{
		temp[k++] = arr[i++];
	}
	while (j <= end)
	{
		temp[k++] = arr[j++];
	}

	for (i = 0; i < k; i++)   	//将临时数组temp中排序后的元素,整合到原数组中
	{
		arr[start + i] = temp[i];
	}

	free(temp);   //结束记得释放
}

2.2代码运行结果

 三、代码思路(附图解)

      首先看原数组(一共分成10个元素):

归并排序----附图解(C语言)_第1张图片

      从上文的介绍我们得知,归并排序的核心的分治法:

      所以第一步将这个数组分开,分成每两个元素一对:(如下图) 

 归并排序----附图解(C语言)_第2张图片

      下一步再将这5个分组分别进行排序(结果如下): 

归并排序----附图解(C语言)_第3张图片

       再将这5组每两组合并成一组,这里一共分成3组,(元素1,6是多余出来的,自成一组),结果如下图:

归并排序----附图解(C语言)_第4张图片

       再将这3组进行排序(结果如下):

归并排序----附图解(C语言)_第5张图片

      继续老办法,将这3个分组两两合并,得到如下两个分组: 

归并排序----附图解(C语言)_第6张图片

      将这2个分组分别排序得: 

归并排序----附图解(C语言)_第7张图片  

      最后终于来到排序的最后一个环节,将这两个分组进行合并,并进行排序,就可以得到我们想要的最后的结果(如下图): 

归并排序----附图解(C语言)_第8张图片

四、总结 

归并排序的优缺点

优点:

1.归并排序的效率达到了巅峰:时间复杂度为O(nlogn),这是基于比较的排序算法所能达到的最高境界。
2.归并排序是一种稳定的算法。
3.归并排序是最常用的外部排序方法。


缺点:
1.归并排序需要O(n)的辅助空间,在同类算法中归并排序的空间复杂度略高。

你可能感兴趣的:(C语言学习,c语言,排序算法,数据结构,vscode,算法)