归并排序(分治思想)

归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。由于归并排序分治出来是一棵二叉树,复杂度T(n)=Θ(nlog(n)),归并排序算法是一种稳定的排序算法。

贴上C语言的代码


void Merg(int *list1, int list1_size, int *list2, int list2_size)
{
    int i = 0, j = 0, k = 0;
    int temp[MAXNUM];
    while (i < list1_size&&j < list2_size)
    {
        if (list1[i] < list2[j])
        {
            temp[k++] = list1[i++];
        }
        if (list1[i] > list2[j])
        {
            temp[k++] = list2[j++];
        }
    }
    
    //如果list1还有剩余就加到temp中,下面list2同理
    while (i < list1_size)
    {
        temp[k++] = list1[i++];
    }
    while (j < list2_size)
    {
        temp[k++] = list2[j++];
    }
    //将排序好的数组整合到list1中
    for (int m = 0; m < (list1_size + list2_size); m++)
    {
        list1[m] = temp[m];
    }
}
//分
void Mergsort(int k[], int n)
{
    if (n > 1)
    {
        int *list1 = k;
        int list1_size = n / 2;
        int *list2 = k + n / 2;
        int list2_size = n - list1_size;
        Mergsort(list1, list1_size);
        Mergsort(list2, list2_size);
        Merg(list1, list1_size, list2, list2_size);
    }
}


总结:

归并排序多用于需要外部排序的场景,除此之外当内部排序需要保证稳定性时也采用归并排序(不要求稳定性的内部排序一般采用快排或者堆排序,前者在待排序序列基本有序时效率低,后者堆的维护是个问题)

猜你喜欢

转载自blog.csdn.net/qq_40327837/article/details/81907644