c#归并排序

来源:互联网 发布:直男癌 知乎 编辑:程序博客网 时间:2024/04/30 22:58

1.需求:将一个数组通过归并排序排成有序数组

2.思想:归并排序是分治法的一个典型应用,将两个有序的序列合并成一个有序的序列称为归并,归并排序,通过将数组分成若干个有序的序列,当拆分成只有一个数时认为是有序的,然后将这些序列归并。这里需要用到递归。

3.实现:

public class MSort
    {
        /// <summary>
        /// 待排序数组
        /// </summary>
        public int[] arr { get; set; }


        /// <summary>
        /// 归并排序
        /// </summary>
        /// <param name="left">指向需归并操作数组的左边界</param>
        /// <param name="right">指向需归并操作数组的右边界</param>
        public void MergeSort(int left,int right)
        {
            if (left < right)
            {
                int mid = (left + right) / 2;


                MergeSort(left, mid);
                MergeSort(mid + 1, right);


                Merge(left,mid,right);
            }
        }


        public void Merge(int left,int mid,int right)
        {
            int[] temparr = new int[right - left + 1];


            int i = left;
            int j = mid + 1;
            int k = 0;
            while (i <= mid && j <= right)
            {
                if (arr[i] < arr[j])
                {
                    temparr[k] = arr[i];
                    i++;
                }
                else
                {
                    temparr[k] = arr[j];
                    j++;
                }
                k++;
            }


            if (i <= mid)
            {
                for (int m = i; m <= mid; m++,k++)
                    temparr[k] = arr[m];
            }
            if (j <= right)
            {
                for (int m = j; m <= right; m++, k++)
                    temparr[k] = arr[m];
            }


            for (int n = 0; n < temparr.Length; n++)
            {
                arr[left + n] = temparr[n];
            }
        }
    }

4.测试代码:

 MSort m = new MSort();
            m.arr = new int[] { 43, 32, 212, 33, 56, 43, 68, 32, 46, 78, 6 };
            m.MergeSort(0, m.arr.Length - 1);


            for (int i = 0; i < m.arr.Length - 1; i++)
            {
                Console.Write(m.arr[i] + " ");
            }
            Console.Write("\n");

5.运行结果:

6.总结:归并排序为时间复杂度O(nlogn)