现在的位置: 首页 > 综合 > 正文

经典排序算法之归并排序

2017年11月01日 ⁄ 综合 ⁄ 共 929字 ⁄ 字号 评论关闭

二路归并与多路归并算法详解

一、二路归并

原理,把原始数组分成若干子数组,对每一个子数组进行排序,

继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组

举例

无序数组[6 2 4 1 5 9]

先看一下每个步骤下的状态,完了再看合并细节

第一步 [6 2 4 1 5 9]原始状态

第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍

第三步 [1 2 4 6] [5 9]继续两组两组合并

第四步 [1 2 4 5 6 9]合并完毕,排序完毕

输出结果[1 2 4 5 6 9]

void merge(int[] unsorted, int first, int mid, int last, int[] sorted)//外部分配中间过程需要的空间sorted
        {
            int i = first, j = mid;
            int k = 0;
            while (i < mid && j < last)
                if (unsorted[i] < unsorted[j])
                    sorted[k++] = unsorted[i++];
                else
                    sorted[k++] = unsorted[j++];

            while (i < mid)
                sorted[k++] = unsorted[i++];
            while (j < last)
                sorted[k++] = unsorted[j++];

            for (int v = 0; v < k; v++)
                unsorted[first + v] = sorted[v];
        }

        void merge_sort(int[] unsorted, int first, int last, int[] sorted)
        {
            if (first < last)
            {
                int mid = (first + last) / 2;
                merge_sort(unsorted, first, mid, sorted);
                merge_sort(unsorted, mid, last, sorted);
                merge(unsorted, first, mid, last, sorted);
            }
        }

       	int Main( )
        {
            int[] x = { 6, 2, 4, 1, 5, 9 };
            int[] sorted = new int[x.Length];
            merge_sort(x, 0, x.Length, sorted);
            for (int i = 0; i < 6; i++)
            {
                cout<<x[i]<<" ";
            }
            cout<<endl;
	    return 0;
        }

平均和最坏时间复杂度 均为 O(NlgN);

抱歉!评论已关闭.