归并排序(递归与非递归实现)

归并排序:采用的是一种分而治之的思想.
过程:将一个数组进行二分,直到有每组有一个元素为止.然后进行合并元素,按照一定的顺序进行排序.
归并排序过程图
代码实现:
①:递归实现

void Merge(int arr[],int left,int mid,int right,int tmp[])
{
    if(right - left <= 1)
    {
        return;
    }
    int start = left;
    int end = mid;
    int index = 0;
    while(start < mid && end < right)
    {
        if(arr[start] < arr[end])
        {
            tmp[index++] = arr[start++];
        }
        else
        {
            tmp[index++] = arr[end++];
        }
    }
    while(start < mid)
    {
        tmp[index++] = arr[start++];
    }
    while(end < right)
    {
        tmp[index++] = arr[end++];
    }
    memcpy(arr + left,tmp,sizeof(int)*(right - left));
}
void _MergeSort(int arr[],int left,int right,int tmp[])
{
    if(right - left <= 1)
    {
        return;
    }
    int mid = left + (right - left)/2;
    _MergeSort(arr,left,mid,tmp);
    _MergeSort(arr,mid,right,tmp);
    Merge(arr,left,mid,right,tmp);
}
//归并排序(递归)
void MergeSort(int arr[],int size)
{
    if(size <= 1)
    {
        return;
    }
    int* tmp = (int*)malloc(sizeof(arr[0])*size);
    _MergeSort(arr,0,size,tmp);
    free(tmp);
}

②:非递归实现

void Merge(int arr[],int left,int mid,int right,int tmp[])
{
    if(right - left <= 1)
    {
        return;
    }
    int start = left;
    int end = mid;
    int index = 0;
    while(start < mid && end < right)
    {
        if(arr[start] < arr[end])
        {
            tmp[index++] = arr[start++];
        }
        else
        {
            tmp[index++] = arr[end++];
        }
    }
    while(start < mid)
    {
        tmp[index++] = arr[start++];
    }
    while(end < right)
    {
        tmp[index++] = arr[end++];
    }
    memcpy(arr + left,tmp,sizeof(int)*(right - left));
}
//非递归
void MergeSortByLoop(int arr[],int size)
{
    if(size <= 1)
    {
        return;
    }
    int gap = 1;
    int* tmp = (int*)malloc(sizeof(arr[0])*size);
    for(;gap < size;gap *= 2)
    {
        int i = 0;
        for(; i < size;i += 2*gap)
        {
            int start = i;
            int mid = gap + i;
            int end = 2*gap + i;
            if(mid > size)
            {
                mid = size;
            }
            if(end > size)
            {
                end = size;
            }
            Merge(arr,start,mid,end,tmp);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/yinghuhu333333/article/details/80964230