归并排序

4

数据

  • 平均时间复杂度:O(nlogn)

  • 最好时间复杂度:O(nlogn)

  • 最坏时间复杂度:O(nlogn)

  • 空间复杂度:O(n)

  • 排序方式:Out-Place

  • 稳定性:稳定

描述

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

动图

C#实现

public class MergeSort
{
    public static void Sort<T>(IList<T> list, Func<T, T, bool> compare)
    {
        var count = list.Count;
        if (count < 2)
        {
            return;
        }

        IList<T> newList = new List<T>(count);
        for (int size = 1; size < count; size += size)
        {
            for (int start = 0; start < count; start += size + size)
            {
                var low = start;
                var mid = Math.Min(start + size - 1, count - 1);
                var high = Math.Min(start + size + size - 1, count - 1);

                InternalMergeSort(list, low, mid, high, compare);
            }
        }
    }

    public static void InternalMergeSort<T>(IList<T> list, int low, int mid, int high, Func<T, T, bool> compare)
    {
        IList<T> newList = new T[high - low + 1];

        var leftStart = low;
        var leftEnd = mid;
        var rightStart = mid + 1;
        var rightEnd = high;

        var index = 0;
        while (leftStart <= leftEnd && rightStart <= rightEnd)
        {
            if (compare(list[leftStart], list[rightStart]))
            {
                newList[index++] = list[leftStart++];
            }
            else
            {
                newList[index++] = list[rightStart++];
            }
        }

        while (leftStart <= leftEnd)
        {
            newList[index++] = list[leftStart++];
        }

        while (rightStart <= rightEnd)
        {
            newList[index++] = list[rightStart++];
        }

        index--;
        while (index >= 0)
        {
            list[rightEnd--] = newList[index--];
        }
    }
}

Lua实现