归并排序

归并排序
归并排序是一种分治算法,其思想是将原始数组切分成较小的数组,直到每个小数组只有一个元素,接着将小数组归并成较大的数组,最后变成一个排序完成的大数组。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
自下而上的迭代;

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

動畫演示:

代碼展示:

  • [ public static List MergeSort(List lst)
    {
    if (lst.Count <= 1)
    return lst;
    int mid = lst.Count / 2;
    List left = new List(); // 定义左侧List
    List right = new List(); // 定义右侧List
    // 以下兩個循環把 lst 分為左右兩個 List
    for (int i = 0; i < mid; i++)
    left.Add(lst[i]);
    for (int j = mid; j < lst.Count; j++)
    right.Add(lst[j]);
    left = MergeSort(left);
    right = MergeSort(right);
    return Merge(left, right);
    }
    ///
    /// 合併兩個已經排好序的List
    ///

    /// 左側List
    /// 右側List
    ///
    static List Merge(List left, List right)
    {
    List temp = new List();
    while (left.Count > 0 && right.Count > 0)
    {
    if (left[0] <= right[0])
    {
    temp.Add(left[0]);
    left.RemoveAt(0);
    }
    else
    {
    temp.Add(right[0]);
    right.RemoveAt(0);
    }
    }
    if (left.Count > 0)
    {
    for (int i = 0; i < left.Count; i++)
    temp.Add(left[i]);
    }
    if (right.Count > 0)
    {
    for (int i = 0; i < right.Count; i++)
    temp.Add(right[i]);
    }
    return temp;
    }]
posted @ 2022-04-12 09:39  今天星闪闪  阅读(39)  评论(0)    收藏  举报