码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2015-07-21 23:51:59      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

    /// <summary>
    /// 归并排序
    /// </summary>
    public class MergeSort
    {
        ///<summary>
        /// 数组的划分
        ///</summary>
        ///<param name="array">待排序数组</param>
        ///<param name="temparray">临时存放数组</param>
        ///<param name="left">序列段的开始位置,</param>
        ///<param name="right">序列段的结束位置</param>
        public static void Sort(int[] array, int[] temparray, int left, int right)
        {
            if (left < right)
            {
                //取分割位置
                int middle = (left + right) / 2;

                //递归划分数组左序列
                Sort(array, temparray, left, middle);

                //递归划分数组右序列
                Sort(array, temparray, middle + 1, right);

                //数组合并操作
                Merge(array, temparray, left, middle + 1, right);
            }
        }

        ///<summary>
        /// 数组的两两合并操作
        ///</summary>
        ///<param name="array">待排序数组</param>
        ///<param name="temparray">临时数组</param>
        ///<param name="left">第一个区间段开始位置</param>
        ///<param name="middle">第二个区间的开始位置</param>
        ///<param name="right">第二个区间段结束位置</param>
        public static void Merge(int[] array, int[] temparray, int left, int middle, int right)
        {
            //左指针尾
            int leftEnd = middle - 1;

            //右指针头
            int rightStart = middle;

            //临时数组的下标
            int tempIndex = left;

            //数组合并后的length长度
            int tempLength = right - left + 1;

            //先循环两个区间段都没有结束的情况
            while ((left <= leftEnd) && (rightStart <= right))
            {
                //如果发现有序列大,则将此数放入临时数组
                if (array[left] < array[rightStart])
                    temparray[tempIndex++] = array[left++];
                else
                    temparray[tempIndex++] = array[rightStart++];
            }

            //判断左序列是否结束
            while (left <= leftEnd)
                temparray[tempIndex++] = array[left++];

            //判断右序列是否结束
            while (rightStart <= right)
                temparray[tempIndex++] = array[rightStart++];

            //交换数据
            for (int i = 0; i < tempLength; i++)
            {
                array[right] = temparray[right];
                right--;
            }
        }
    }

调用:

int[] arr = { 100, 1, 2, 20, 29, 30, 201, 40 };
MergeSort.Sort(arr, new int[arr.Length], 0, arr.Length - 1);

归并排序的时间复杂度为O(nlogn)。 

归并排序

标签:

原文地址:http://www.cnblogs.com/laixiancai/p/4665803.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!