归并排序

        static void Merging_Sort(int[] a)  //归并排序算法

        {

            int[] Temp=new int[a.Length];

            MSort(a,Temp,0,a.Length-1);

        }

        static void MSort(int[] Source, int[] Temp, int start, int end)

        {

            if (start < end)                             //拆分到只有一个元素为止,这时可认为这个数组是有序的,因为只有一个元素

            {

                int middle = (start + end) / 2;              //取数组的中间位

                MSort(Source, Temp, start, middle);        //拆分左半部分

                MSort(Source, Temp, middle + 1, end);      //拆分右半部分

                Merge(Source, Temp, start, middle, end);   //将拆分后的元素合并到结果数组并,并在插入时排序

            }

        }

        static void Merge(int[] Source, int[] Temp, int start, int middle, int end)  //合并Source数组,合并时排序,排序后的结果输出到Temp数组

        {

            int i = start;

            int j = middle + 1;

            int k = 0;

            while (i <= middle && j <= end) 

            {

                if(Source[i] <= Source[j])    //取左半边和右半边比较,取较小值写入数组 

                    Temp[k++] = Source[i++];             

                else

                    Temp[k++] = Source[j++];

            }

            while(i <= middle)      //将左半边剩余元素写入数组

                Temp[k++] = Source[i++]; 

            while(j <= end)         //将右半边剩余元素写入数组

                Temp[k++] = Source[j++];

            for (i = 0; i < k; i++) 

            {

                Source[start + i] = Temp[i];          //注意是start+i,不是每次都从0位置开始写入的,要从start开始写入

            }

        }

点赞