归并排序

归并排序是分治法的典型应用。基本思想是将一个数组分成左右两部分,对其分别排序,然后合并这两个有序数组,成为一个整个的有序数组。

合并两个有序数组也十分简单,两个指针分别指向两个有序数组的首地址,哪个数小,就将其移动到新数组中,直到两个数组为空,新数组就是合并后的有序数组,合并两个数组也称为二路归并。

归并排序是稳定的排序,即相等的元素的顺序不会改变。如果要排序数据包含多个信息,而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要。这也是它比快速排序优势的地方。

void merge(int *arr1, int *arr2, int *result, int len1, int len2)
{
    int i = 0;
    int j = 0;
    int k = 0;
    while(i < len1 || j < len2)
    {
        if(j == len2 || arr1[i] < arr2[j])
        {
            result[k] = arr1[i];
            i++;
            k++;
        }
        else if(i == len1 || arr1[i] >= arr2[j])
        {
            result[k] = arr2[j];
            j++;
            k++;
        }
    }
}

void merge_sort(int *arr, int left, int right)
{
    if(right < left)
    {
        int mid = (right + left) / 2;
        merge_sort(arr, left, mid);
        merge_sort(arr, mid + 1, right);
        int result[right - left];
        merge(arr, arr + mid + 1, result, mid - left, right - mid - 1);
    }
}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap