C++排序算法(归并排序)

分治:

归并排序:把两个有序素组合并成1个。下面是示意图:

一路按组拆分,直到拆分到最后

接下里进行

实现代码

/*归并排序*/
//1.准备临时数组
//2.数据依序从原来数组中放入临时数组中
//2.1循环放完一半
//2.2 把2.1没有放完的部分 放完
//3.数据从临时数组拷贝回原函数,释放临时数组内存
//4.把一个数组

void mergesort(int* a, int l, int r)  //递归 l为第一个元素的下标,r为最后一个元素的下标
{
    if(l==r)
        return;
    int m = l + (r - l) / 2;
    mergesort(a, l, m); //拆左边
    mergesort(a, m + 1, r);//拆右边
    merge_sort(a, l, m, r);//左右两边合并


}
void merge_sort(int* a, int l, int m, int r)
{
    int len = r - l + 1;
    int* p = new int[len];

    int left = l;
    int right = m + 1;
    int k = 0;
    while(left<=m&&right<=r)
    {  
        if(a[left]<a[right])
            p[k++] = a[left++];
        else
            p[k++] = a[right++];
    }

    while(right<=r)
        p[k++] = a[right++]; 
    while(left<=m)
        p[k++] = a[left++];
    memcpy(a+l, p, sizeof(int) * len);

    delete[] p;
    p = NULL;
}
void MergeSort(int *a, int len)
{
    mergesort(a, 0, len - 1);
}

void test()
{
    int aim2[10]={199,3,15,17,19,0,2,4,6,8};
    MergeSort(aim2, 10);

    cout << "start" << endl;
    for (size_t i = 0; i < NUMBER; i++)
    {
    
        cout << aim2[i] << endl;
    }


}

输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值