算法-归并排序

时间:2021-05-27 04:13:35

归并排序,英文名称是MERGE-SORT。它是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

比较 a[i] b[j] 的大小,若 a[i]≤b[j],则将第一个有序表中的元素 a[i] 复制到 r[k] 中,并令 i k 分别加上1;否则将第二个有序表中的元素b[j]复制到 r[k] 中,并令 j k 分别加上1;如此循环下去,直到其中一个有序表取完;然后再将另一个有序表中剩余的元素复制到 r 中从下标 k 到下标 t 的单元。

归并排序评价

归并排序的最坏时间复杂度为O(nlogn) ,是一种稳定排序算法

代码实现

#region 归并排序
        /// <summary>
        /// 合并
        /// </summary>
        /// <param name="arr">合并的数组</param>
        /// <param name="L">最左边的下标</param>
        /// <param name="M">左右两个数组的中间段</param>
        /// <param name="R">最右的下标</param>
        static void merge( int [] arr,int L,int M,int R)
        {
            int Left_Size =M-L+1 ;
            int Right_Size =R-M ;
            int [] Left=new int[Left_Size];
            int[] Right = new int[Right_Size];
            int i,j,k;
            for (i = L; i <= M; i++)
            {
                Left[i - L] = arr[i];
            }
            for (i = M+1; i <R; i++)
            {
                Right[i - M] = arr[i];
            }
            i = 0; j = 0; k = L;
            while (i<Left_Size && j<Right_Size)
            {
                if (Left[i] < Right[j])
                {
                    arr[k] = Left[i];
                    i++;
                    k++;
                }
                else
                {
                    arr[k] = Right[j];
                    j++;
                    k++;
                }
            }
            while (i<Left_Size)
            {
                arr[k] = Left[i];
                i++;
                k++;
            }
            while (j<Right_Size)
            {
                arr[k] = Right[j];
                j++;
                k++;
            }
        }