笑猫先森 2024-06-28 23:29 采纳率: 40%
浏览 8
已结题

我的并归排序为什么不对

能运行但排的不对,compare应该没问题


#include<iostream>
#include<vector>
using namespace std;

template<typename T, typename C>
void merge(typename vector<T>::iterator left, typename vector<T>::iterator mid,
    typename vector<T>::iterator end, C Compare, vector<T>&temp);

template<typename T,typename C>
void mergeSort(typename vector<T>::iterator begin, typename vector<T>::iterator end,C Compare,vector<T>&temp)
{
    if (begin < end)
    {
        auto mid = begin + distance(begin, end) / 2;
        mergeSort<T,C>(begin, mid, Compare,temp);
        mergeSort<T,C>(mid+1, end, Compare,temp);
        merge<T,C>(begin, mid, end, Compare, temp);
    }
    
}

template<typename T, typename C>
void merge(typename vector<T>::iterator left, typename vector<T>::iterator mid, 
    typename vector<T>::iterator right,C Compare, vector<T>&temp)
{
    auto i = left;
    auto j = mid+1;
    auto k = temp.begin();
    while (i !=mid && j != right)
    {
        if (Compare(i, j))
        {
            *k++ = *i++;
        }
        else
        {
            *k++ = *j++;
        }
    }
    while (i <=mid) *k++ = *i++;
    while (j <right) *k++ = *j++;

    move(temp.begin() , k , left);

    for (const auto it : temp)
    {
        cout << it << " ";
    }
    cout << endl;
}

struct Compare
{
    template<typename T>
    bool operator()(const T& a,const T& b) const
    {
        return *a < *b;
    }
};

int main()
{
    vector<int>vec = { 1,4,5,3,2 };
    vector<int>temp(vec.size());
    mergeSort<int,Compare>(vec.begin(), vec.end(), Compare{}, temp);
    for (const auto it : vec)
    {
        cout << it <<" ";
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • Roc-xb 后端领域优质创作者 2024-06-29 01:38
    关注
    
    #include <iostream>
    #include <vector>
    #include <iterator>
    using namespace std;
    
    template <typename T, typename C>
    void merge(typename vector<T>::iterator left, typename vector<T>::iterator mid,
               typename vector<T>::iterator right, C Compare, vector<T> &temp);
    
    template <typename T, typename C>
    void mergeSort(typename vector<T>::iterator begin, typename vector<T>::iterator end, C Compare, vector<T> &temp)
    {
        if (distance(begin, end) > 1)
        {
            auto mid = begin + distance(begin, end) / 2;
            mergeSort<T, C>(begin, mid, Compare, temp);
            mergeSort<T, C>(mid, end, Compare, temp);
            merge<T, C>(begin, mid, end, Compare, temp);
            
            // 打印排序过程
            for (auto it = begin; it != end; ++it)
            {
                cout << *it << " ";
            }
            cout << endl;
        }
    }
    
    template <typename T, typename C>
    void merge(typename vector<T>::iterator left, typename vector<T>::iterator mid,
               typename vector<T>::iterator right, C Compare, vector<T> &temp)
    {
        auto i = left;
        auto j = mid;
        auto k = temp.begin();
    
        while (i != mid && j != right)
        {
            if (Compare(*i, *j))
            {
                *k++ = *i++;
            }
            else
            {
                *k++ = *j++;
            }
        }
        while (i != mid)
            *k++ = *i++;
        while (j != right)
            *k++ = *j++;
    
        move(temp.begin(), k, left);
    }
    
    struct Compare
    {
        template <typename T>
        bool operator()(const T &a, const T &b) const
        {
            return a < b;
        }
    };
    
    int main()
    {
        vector<int> vec = {1, 4, 5, 3, 2};
        vector<int> temp(vec.size());
        mergeSort<int, Compare>(vec.begin(), vec.end(), Compare{}, temp);
        cout << "最终排序结果: ";
        for (const auto &it : vec)
        {
            cout << it << " ";
        }
        return 0;
    }
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?