zoukankan      html  css  js  c++  java
  • 算法归并排序

    归并排序简言之,假设一个数组分成两个有同序的小数组(1/2组),然后将二者合并。

    递归的假设,将小组再假设分成两个有同序的小组(1/4组),然后合并二者。

    递归。。。。

    最后1/n组剩下一个数据了,两个1/n组合并。这应该easy哈。

    递归实现如下:

            /// <summary>
            
    /// Merge Sort O(nlogn)
            
    /// </summary>
            
    /// <param name="arr"></param>
            public static void MergeSort(int[] arr)
            {
                if (arr == null)
                {
                    throw new ArgumentNullException();
                }

                MergeSort(arr, 0, arr.Length - 1);
            }

            private static void MergeSort(int[] arr, int first, int last)
            {
                if (arr == null)
                {
                    throw new ArgumentNullException();
                }

                if (first < last)
                {
                    int mid = (first + last) / 2;
                    // Split the original array to two small arrays,[first,mid] and [mid+1,last]
                    MergeSort(arr, first, mid);
                    MergeSort(arr, mid + 1, last);

                    // Merge two small arrays to an array
                    int index1 = first;
                    int index2 = mid + 1;
                    int[] tempArr = new int[last - first + 1];
                    int tempIndex = 0;
                    while (index1 <= mid && index2 <= last)
                    {
                        if (arr[index1] < arr[index2])
                        {
                            tempArr[tempIndex++] = arr[index1];
                            index1++;
                        }
                        else
                        {
                            tempArr[tempIndex++] = arr[index2];
                            index2++;
                        }
                    }

                    while (index1 <= mid)
                    {
                        tempArr[tempIndex++] = arr[index1];
                        index1++;
                    }

                    while (index2 <= last)
                    {
                        tempArr[tempIndex++] = arr[index2];
                        index2++;
                    }

                    tempIndex = 0;
                    while (tempIndex < tempArr.Length)
                    {
                        arr[first + tempIndex] = tempArr[tempIndex];
                        tempIndex++;
                    }
                }
            }

    我发现这个归并也我写QuickSort快,我想我的快排写的有问题??? 我得研究一下了。

  • 相关阅读:
    SUSE 安装 iServer、iDesktop启动异常问题
    各系统勒索补丁下载地址
    centos 安装atom 笔记
    转载---SuperMap GIS 9D SP1学习视频播单
    SuSE的命令安装软件 zypper
    Leaflet客户端学习笔记
    设置UI控件的Layer属性(边框可见,边框颜色,边框宽度,边框圆角)
    安全清理Xcode 缓存垃圾
    OC变量命名禁忌
    iOS中的应用启动原理
  • 原文地址:https://www.cnblogs.com/ericwen/p/MergeSort.html
Copyright © 2011-2022 走看看