算法学习笔记之合并排序

原理:采用分治策略,将整个数组划分成小的数组进行排序,之后再进行合并,通常结合递归来实现

适用于大数据排序 

时间复杂度:Θ(nlgn)

C#实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AlgorithmTest
{
    class MergeSort
    {
        public void _MergeSort ( int[] arr, int start, int end)
        {
            if (start >= end)
                return;
          
            int middle = start + ((end - start) >>1);
            _MergeSort(arr, start, middle);
            _MergeSort(arr, middle+1, end);
            _MergeDataInArray(arr, start, middle, end);
        }

        private void _MergeDataInArray ( int[] arr, int start, int middle, int end )
        {
            int leftCount = middle - start + 1;
            int rightCount = end - middle;
            int[] leftArr = new int[leftCount];
            int[] rightArr = new int[rightCount];

            int i = 0;
            int j = 0;
            for (i = start; i <= middle; i++)
            {
                leftArr[i-start] = arr[i];
            }
            for (j = middle + 1; j <= end; j++)
            {
                rightArr[j-middle-1] = arr[j];
            }

            i = 0;
            j = 0;
            int k;
            for (k = start; k <= end; k++)
            {
                if (i >= leftCount)
                {
                    for (int a = j; a < rightCount; a++)
                    {
                        arr[k] = rightArr[a];
                        k++;
                    }
                    break;
                }
                if (j >= rightCount)
                {
                    for (int a = i; a < leftCount; a++)
                    {
                        arr[k] = leftArr[a];
                        k++;
                    }
                    break;
                }
                if (leftArr[i] <= rightArr[j])
                {
                    arr[k] = leftArr[i];
                    i++;
                }
                else
                {
                    arr[k] = rightArr[j];
                    j++;
                }
            }
        }
    }
}

点赞