八大排序算法之五——归并排序

1、基本思想。

归并排序是将两个(或两个以上)的有序表合并成一个新的有序表。

2、实现。

/**
 * @brief mergeSortedArray 将两个已经排好序的区间
 *  [first,mid] 、[mid+1,last] 合并成一个排好序的区间
 * @param array 总区间的起始地址
 * @param first 第一个有序区间的起点
 * @param mid   第一个有序区间的终点
 * @param last  第二个区间的终点
 */
void mergeSortedArray(int* array,int first,int mid,int last)
{
    int* tempArray=(int*)malloc((last-first+1)*sizeof(int));
    int indexPre=first;
    int indexRear=mid+1;
    int tempArrayIndex=0;
    for(;indexPre<=mid&&indexRear<=last;tempArrayIndex++)
    {
        if(array[indexPre]<=array[indexRear])
        {
            tempArray[tempArrayIndex]=array[indexPre++];
        }
        else
        {
            tempArray[tempArrayIndex]=array[indexRear++];
        }
    }

    if(indexPre<=mid)
    {
        for(int i=indexPre;i<=mid;++i)
        {
            tempArray[tempArrayIndex++]=array[i];
        }
    }

    if(indexRear<=last)
    {
        for(int i=indexRear;i<=last;++i)
        {
            tempArray[tempArrayIndex++]=array[i];
        }
    }

    for(int i=0;i<last-first+1;++i)
    {
        array[i+first]=tempArray[i];
    }
    free(tempArray);
}

void mergeSort(int* array,int first,int last)
{
    int mid=0;
    if(first<last)
    {
        mid=(first+last)/2;
        mergeSort(array,first,mid);
        mergeSort(array,mid+1,last);
        mergeSortedArray(array,first,mid,last);
    }
    return;
}


int main()
{
    int a[10]={11,42,53,25,36,6,75,8,26,4};
    std::cout<<"before sort:"<<std::endl;
    for(int i=0;i<10;++i)
        std::cout<<a[i]<<"\t";
    std::cout<<std::endl;

    mergeSort(a,0,9);

    std::cout<<"after sort:"<<std::endl;

    for(int i=0;i<10;++i)
        std::cout<<a[i]<<"\t";
    std::cout<<std::endl;
    return 0;
}

3、执行结果。

阅读更多
所属专栏: 数据结构与算法
上一篇八大排序算法之四——快速排序
下一篇八大排序算法之六——堆排序
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭