public void Merge(int[] a, int start, int mid, int end)
        {
            int[] tmp = new int[end - start + 1];    // tmp是汇总2个有序区的临时区域
            int i = start;            // 第1个有序区的索引
            int j = mid + 1;        // 第2个有序区的索引
            int k = 0;                // 临时区域的索引

            while (i <= mid && j <= end)
            {
                if (a[i] <= a[j])
                {
                    tmp[k++] = a[i++];
                }
                else
                {
                    tmp[k++] = a[j++];
                }
            }

            while (i <= mid)
            {
                tmp[k++] = a[i++];
            }

            while (j <= end)
            {
                tmp[k++] = a[j++];
            }

            // 将排序后的元素,全部都整合到数组a中。
            for (i = 0; i < k; i++)
            {
                a[start + i] = tmp[i];
            }

            tmp = null;
        }

        public void MergeSort(int[] a, int start, int end)
        {
            if (a == null || start >= end)
                return;

            int mid = (end + start) / 2;
            MergeSort(a, start, mid); // 递归排序a[start...mid]
            MergeSort(a, mid + 1, end); // 递归排序a[mid+1...end]

            // a[start...mid] 和 a[mid...end]是两个有序空间,
            // 将它们排序成一个有序空间a[start...end]
            Merge(a, start, mid, end);
        }

归并排序(合并排序)的实现。使用分治法用递归来实现排序。

posted on 2017-05-28 11:55  Sempron2800+  阅读(158)  评论(0编辑  收藏  举报