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