归并排序-C/C++实现

归并排序

递归实现归并排序:

void merge_sort(int *a, int l, int r){
    int mid = (l+r)/2;

    //若只有一个元素,返回上一层(有两个元素)
    if(r-l == 0) return ;

    //不断分成左右两边
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);

    int k = 0;
    int l_i = l,r_i=mid+1;

    //把左右两个子序列按顺序放到tmp里(不用tmp的话会导致左半边元素被覆盖)
    int * tmp = new int[r-l+1];
    while(l_i <= mid && r_i <= r){
        if(a[l_i]<=a[r_i]) tmp[k] = a[l_i++];
        else tmp[k] = a[r_i++];
        ++k;
    }
    //若其中一个没排完,把剩下的元素补进tmp
    while(l_i <= mid) tmp[k++] = a[l_i++];
    while(r_i <= r) tmp[k++] = a[r_i++];

    for(int i = l, j = 0; i <= r; i++, j++){
        a[i] = tmp[j];
    }
    delete tmp;
}

image.png

完整代码

在线测试运行结果:click

#include <iostream>
using namespace std;

void merge_sort(int *a, int l, int r){
    int mid = (l+r)/2;

    //若只有一个元素,返回上一层(有两个元素)
    if(r-l == 0) return ;

    //不断分成左右两边
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);

    int k = 0;
    int l_i = l,r_i=mid+1;

    //把左右两个子序列按顺序放到tmp里(不用tmp的话会导致左半边元素被覆盖)
    int * tmp = new int[r-l+1];
    while(l_i <= mid && r_i <= r){
        if(a[l_i]<=a[r_i]) tmp[k] = a[l_i++];
        else tmp[k] = a[r_i++];
        ++k;
    }
    //若其中一个没排完,把剩下的元素放进tmp
    while(l_i <= mid) tmp[k++] = a[l_i++];
    while(r_i <= r) tmp[k++] = a[r_i++];

    for(int i = l, j = 0; i <= r; i++, j++){
        a[i] = tmp[j];
    }
    delete tmp;
}

int main()
{
    int a[] = {2,4,1,6,8,5,3,7};
    int n = sizeof(a)/sizeof(a[0]);
        merge_sort(a,0,n-1);
    for(auto s:a){
        cout << s << ' ';
    }
    return 0;
}

原文链接: https://www.cnblogs.com/wzha/p/12524461.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    归并排序-C/C++实现

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/336282

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午10:34
下一篇 2023年3月1日 下午10:34

相关推荐