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

posted on 2021-11-11 11:52  LostDog  阅读(51)  评论(0)    收藏  举报