归并排序

一、归并排序算法基本思想

归并排序是基于分治的思想,把整个数组Array的排序问题,分成两个子数组Array1和Array2的先各自排序,然后合并成一个新数组的问题。以此递归下去,直到子数组的大小为1的时候,结束递归调用。

二、归并排序的数据结构

利用数组,以递归树的形式来解决。

三、排序过程图解


四、算法源代码

1.二路归并排序

/**
    二路归并排序

*/

#include<cstdio>

//待排序的数组
int arry[] = {2,5,6,7,3,1};
int cmp;
void mergeSort(int arr[],int s,int t);
void myMerge(int arr[],int s,int m,int t);
void printArr(int arr[],int s, int t);

int main()
{

    cmp = 0;
    printf("Before merge-sorting the array is :\n");
    printArr(arry,0,5);

    mergeSort(arry,0,5);

    printf("After merge-sorting the array is :\n");
    printArr(arry,0,5);


    printf("\n cmp = %d",cmp);
    return 0;
}

//归并排序
void mergeSort(int arr[],int s,int t)
{
    if(s<t)
    {
        int m = (s+t)/2;
        mergeSort(arr,s,m);
        mergeSort(arr,m+1,t);
        myMerge(arr,s,m,t);
    }
    else
    {
        return ;
    }
}

//合并两个排好序的数组
void myMerge(int arr[],int s,int m,int t)
{
    int i = s;
    int j = m+1;
    int p = 0;

    //这里借用了一个中间数组来合并
    int newArr[t-s+1];

    while(i<=m&&j<=t){
        if(arr[i]<arr[j]){
            newArr[p++] = arr[i++];
        }else{
            newArr[p++] = arr[j++];
        }
        cmp++;
    }

    while(i<=m)
        newArr[p++] = arr[i++];
    while(j<=t)
        newArr[p++] = arr[j++];

    p = 0;
    for(int k=s;k<=t;k++)
        arr[k] = newArr[p++];
}
//打印数组
void printArr(int arr[],int s, int t)
{
    for(int i=s;i<=t;i++)
        printf("%d ",arr[i]);
    printf("\n");
}



2.三路归并排序(拓展)

#include<cstdio>

//待排序测试的数组
int arry[] = {7,11,9,15,18,22,0,1,102,18,19};

void mergeSort(int arr[],int s,int t);
void myMerge(int arr[],int s,int m,int t);
void printArr(int arr[],int s, int t);

int main()
{
    printf("Before merge-sorting the array is :\n");
    printArr(arry,0,10);

    mergeSort(arry,0,10);

    printf("After merge-sorting the array is :\n");
    printArr(arry,0,10);

    return 0;
}

//归并排序
void mergeSort(int arr[],int s,int t)
{
    if(s<t)
    {
        int p1 = (t-s)/3+s;
        int p2 = (t-s)/3*2 + s;

        //分成三段
        mergeSort(arr,s,p1);
        mergeSort(arr,p1+1,p2);
        mergeSort(arr,p2+1,t);

        //归并两次
        myMerge(arr,s,p1,p2);
        myMerge(arr,s,p2,t);

    }
    else
    {
        return ;
    }
}

//合并两个排好序的数组
void myMerge(int arr[],int s,int m,int t)
{
    int i = s;
    int j = m+1;
    int p = 0;

    //这里借用了一个中间数组来合并
    int newArr[t-s+1];

    while(i<=m&&j<=t){
        if(arr[i]<arr[j]){
            newArr[p++] = arr[i++];
        }else{
            newArr[p++] = arr[j++];
        }
    }

    while(i<=m)
        newArr[p++] = arr[i++];
    while(j<=t)
        newArr[p++] = arr[j++];

    p = 0;
    for(int k=s;k<=t;k++)
        arr[k] = newArr[p++];
}
//打印数组
void printArr(int arr[],int s, int t)
{
    for(int i=s;i<=t;i++)
        printf("%d ",arr[i]);
    printf("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值