排序算法(四)————归并排序

归并排序原理:
是将两个有序数列再次进行排序后插入到数列中,使其形成一个有序的数列的过程,当然,假如要有两个有序数列本身条件就是很困难的,所以采用了分治法将数列进行不断切分,到最后每个小数列只存在一个元素,便可看作是有序,利用递归来求得最后的有序数列,其代码难度比别的几个排序大一些,在这里讲解大家可能无法理解,所以附上一些很不错的视频,大家可以去看看,视频讲的很清晰,很好理解。
视频链接:点击这里转到视频
下面是我敲的代码实现,使用C语言,已经过测试,大家可以参考:
代码实现:

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

void mergeSort(int arr[], int L, int R);

int main( )
{
	int arr[6] = { 12,24,22,14,18,91 };
	mergeSort(arr, 0, 5);
	for (int i = 0;i < 6;i++)
	{
		printf_s("%d\n", arr[i]);
	}

	/*int arr[8] = { 5,6,4,2,3,1};
	mergeSort(arr, 0, 5);
	for (int i = 0;i < 6;i++)
	{
		printf_s("%d\n", arr[i]);
	}*/
}
//L和R都是index,注意
void merge(int arr[], int L, int M, int R)
{
	int Left_Size = M - L;
	int Right_Size = R - M + 1;
	//int Left[Left_Size];
	int* Left = (int*)malloc(sizeof(int) * Left_Size);
	if (Left == nullptr) { exit(-1); }
	int* Right = (int*)malloc(sizeof(int) * Right_Size);
	if (Right == nullptr) { exit(-1); }
	//int i; 
	for (int i = L;i < M;i++)
	{
		Left[i - L] = arr[i];
	}
	for (int i = M;i <= R;i++)
	{
		Right[i-M] = arr[i];
	}

	int	i = 0,j = 0,k = L;
	while (i < Left_Size && j < Right_Size)
	{
		if (Left[i] < Right[j])
		{
			arr[k] = Left[i];
			i++;
			k++;
		}
		else
		{
			arr[k] = Right[j];
			j++;
			k++;
		}
	}
	while (i < Left_Size)
	{
		arr[k] = Left[i];
		i++;
		k++;
	}
	while (j < Right_Size)
	{
		arr[k] = Right[j];
		j++;
		k++;
	}

}
//L和R都是index,注意
void mergeSort(int arr[], int L,int R)
{
	
	if (L == R)
	{
		return;
	}
	else
	{
	int M = (L + R) / 2;
	mergeSort(arr, L, M);
	mergeSort(arr, M + 1, R);
	//这里第二个参数表示的是第二个数组第一个开头元素,所以我们要传入M+1
	merge(arr, L, M+1, R);
	}
}

算法时间复杂度为: O( nlogn ),具体推导我下一次更新。

原创文章 24 获赞 2 访问量 925

猜你喜欢

转载自blog.csdn.net/weixin_43653187/article/details/104724567