美文网首页
算法与数据结构-归并排序

算法与数据结构-归并排序

作者: Zhen斌iOS | 来源:发表于2020-06-06 11:32 被阅读0次

    一、概念

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

    • 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
    • 自下而上的迭代;

    二、算法步骤

    1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
    2、设定两个指针,最初位置分别为两个已经排序序列的起始位置;
    3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
    4、重复步骤 3 直到某一指针达到序列尾;
    5、将另一序列剩下的所有元素直接复制到合并序列尾。

    三、动图演示

    mergeSort.gif

    四、实现

    1、C语言实现
    #include <stdio.h>
    int min(int x, int y) {
        return x < y ? x : y;
    }
    void merge_sort(int arr[], int len) {
        int *a = arr;
        int *b = (int *) malloc(len * sizeof(int));
        int seg, start;
        for (seg = 1; seg < len; seg += seg) {
            for (start = 0; start < len; start += seg * 2) {
                int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
                int k = low;
                int start1 = low, end1 = mid;
                int start2 = mid, end2 = high;
                while (start1 < end1 && start2 < end2)
                    b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
                while (start1 < end1)
                    b[k++] = a[start1++];
                while (start2 < end2)
                    b[k++] = a[start2++];
            }
            int *temp = a;
            a = b;
            b = temp;
        }
        if (a != arr) {
            int i;
            for (i = 0; i < len; i++)
                b[i] = a[i];
            b = a;
        }
        free(b);
    }
    int main() {
            int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
            int len = (int) sizeof(arr) / sizeof(*arr);
            merge_sort(arr, len);
            int i;
            for (i = 0; i < len; i++)
                    printf("%d ", arr[i]);
            return 0;
    }
    

    相关文章

      网友评论

          本文标题:算法与数据结构-归并排序

          本文链接:https://www.haomeiwen.com/subject/gepvzhtx.html