归并排序(详细代码)

归并排序(Merge Sort)是建立在归并操作上的一种有限、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序是一种稳定性排序

void _merge(int arr[],int left,int right);
void _merge_in(int arr[],int left,int mid,int right);

//---归并排序---
void MergeSort(int arr[],int len)
{
    _merge(arr,0,len-1);
}

void _merge(int arr[],int left,int right)
{
    //---递归操作---
    if (left >= right)
        return;
    int mid = ((right - left)>>1) + left;
    _merge(arr,left,mid);//左区间递归
    _merge(arr,mid+1,right);//右区间递归

    //---合并操作---
    _merge_in(arr,left,mid,right);
}

void _merge_in(int arr[],int left,int mid,int right)
{
    //---动态开辟一个辅助空间---
    int len = right - left +1;
    int *pData = new int[len];
    memset(pData,0,sizeof(int)*len);//内存逐字节赋值

    int low = left;//左区间第一个位置
    int hig = mid+1;//右区间第一个位置
    int index = 0;//辅助空间下标

    while (low<=mid && hig<=right)//左右区间都存在
    {
        //左区间存在,且左区间值<=右区间值
        while (low<=mid && arr[low]<=arr[hig])
        {
            pData[index] = arr[low];
            low++;
            index++;
        }
        //右区间存在,且右区间值<=左区间值
        while (hig<=right && arr[low]>=arr[hig])
        {
            pData[index] = arr[hig];
            hig++;
            index++;
        }
    }
    //---到这一步,有一区间一定是操作完的---
        
    if (low<=mid)//左区间没操作完
        memmove(&pData[index],&arr[low],sizeof(int)*(mid-low+1));
    if (hig<=right)//右区间没操作完
        memmove(&pData[index],&arr[hig],sizeof(int)*(right-hig+1));

    //将辅助数组拷贝到原数组
    memmove(&arr[left],pData,sizeof(int)*len);
    delete [] pData;
}

你可能感兴趣的:(算法,数据结构)