Lee_Serena 2024-04-20 15:32 采纳率: 14.3%
浏览 3

2,设计一个类模板Sample,能实现对类型不限的数组的排序功能。

2,设计一个类模板Sample,能实现对类型不限的数组的排序功能。求:
1)至少提供两种排序方法;
2)只允许提供一个sort函数接口来选择性调用指定排序方法(冒泡、选择或插入等等)和排序类型(升序或降序)。
怎么实现存储任意类型的数据啊,代码应该也有点问题

#include<iostream>
#include"Sample.h"
using namespace std;
template<typename T>
void Sample::Select(T a, int flag)
{
    int i = 0;
    T temp = 0;
    int size = sizeof(a) / sizeof(T);
    if (flag == 0)
    {
        for (i = 0;i < size;i++)
        {
            if (a[i] < a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
    else if (flag == 1)
    {
        for (int i = 0;i < size;i++)
        {
            if (a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
    cout << "排序后:" << endl;
    for (i = 0;i < size;i++)
        cout << a[i] << " ";
    cout << endl;
}
template<typename T>
void Sample::Bubble(T a, int flag)
{
    int i, j = 0;
    T temp = 0;
    int size = sizeof(a) / sizeof(T);
    for (i = 0;i < size;i++)
        for (j = 0;j < size - i - 1;j++)
        {
            if (flag == 0)
            {
                if (a[j] < a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
            if (flag == 1)
            {
                if (a[j] > a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    cout << "排序后:" << endl;
    for (i = 0;i < size;i++)
        cout << a[i] << " ";
    cout << endl;
}
template<typename T>
void Sample::Sort(T a, int Choice1, int Choice2)
{
    Sample sam;
    if (Choice1 == 0)
        sam.Select(a, Choice2);
    if (Choice1 == 1)
        sam.Bubble(a, Choice2);
}
int main()
{
    //排序
    /*int n = 0;
    cout << "请输入您想排序的数据个数" << endl;*/
    //cin >> n;
    char cha[10000];
    int n = 0;
    int Choice1 = 0;
    int Choice2 = 0;
    cout << "请输入您想排序的序列" << endl;
    /*while (cin.getline())
    {
        cin >> cha[n];
        n++;
    }*/
    cin.getline(cha, 6);
    cout << "您输入的序列为:" << endl;
    for (int i = 0;i < 5;i++)
        cout << cha[i] << " ";
    cout << endl;
    cout << "请选择排序方法:【0】选择排序 【1】冒泡排序" << endl;
    cin >> Choice1;
    cout << "请选择排序方法:【0】降序 【1】升序" << endl;
    cin >> Choice2;
    Sample::Sort(cha, Choice1, Choice2);
    return 0;
}

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-20 15:32
    关注

    引自免费微信小程序:皆我百晓生

    为了实现一个可以对任意类型数组进行排序的类模板,你需要确保排序函数可以处理不同类型的数据。这里我们使用C++的模板特化技术,并且使用标准库中的std::sort函数来进行排序。同时,我们可以定义一个枚举类型来表示排序方式和顺序。以下是修改后的代码:

    #include <iostream>
    #include <algorithm> // 添加此行,用于使用std::sort
    #include <vector>   // 添加此行,用于动态管理数组大小
    using namespace std;
    
    // 定义枚举类型,表示排序方式和顺序
    enum class SortMethod { SELECT, BUBBLE };
    enum class Order { ASC, DESC };
    
    // 定义模板类Sample
    template <typename T>
    class Sample {
    public:
        void sort(vector<T>& arr, SortMethod method, Order order) {
            switch (method) {
                case SortMethod::SELECT: {
                    if (order == Order::ASC)
                        selectSort(arr);
                    else if (order == Order::DESC)
                        reverseSelectSort(arr);
                    break;
                }
                case SortMethod::BUBBLE: {
                    if (order == Order::ASC)
                        bubbleSort(arr);
                    else if (order == Order::DESC)
                        reverseBubbleSort(arr);
                    break;
                }
                default:
                    throw invalid_argument("Invalid sorting method");
            }
        }
    
    private:
        void selectSort(vector<T>& arr) {
            // 实现选择排序算法
            // ...
        }
    
        void reverseSelectSort(vector<T>& arr) {
            // 实现反向选择排序算法(降序)
            // ...
        }
    
        void bubbleSort(vector<T>& arr) {
            // 实现冒泡排序算法
            // ...
        }
    
        void reverseBubbleSort(vector<T>& arr) {
            // 实现反向冒泡排序算法(降序)
            // ...
        }
    };
    
    int main() {
        vector<char> cha{'a', 'b', 'd', 'c', 'e'};
        int Choice1 = 0; // 选择排序方法
        int Choice2 = 0; // 选择排序顺序
    
        cout << "请选择排序方法:【0】选择排序 【1】冒泡排序" << endl;
        cin >> Choice1;
    
        cout << "请选择排序顺序:【0】升序 【1】降序" << endl;
        cin >> Choice2;
    
        Sample<char> sam;
        sam.sort(cha, static_cast<SortMethod>(Choice1), static_cast<Order>(Choice2));
    
        cout << "排序后:" << endl;
        for (char c : cha)
            cout << c << " ";
        cout << endl;
    
        return 0;
    }
    

    在这个版本中,我将原始代码中的静态数组替换为动态管理大小的std::vector。这样,无论用户输入多少个元素,都可以正确地进行排序。同时,删除了原有的SelectBubble函数,改为在sort函数内部根据用户的选项调用相应的排序算法。

    由于这里仅提供了模板类的结构,具体的排序算法(如选择排序、冒泡排序以及它们的反向版本)并未给出,你需要自己实现这些排序算法的具体内容。例如,选择排序的基本思路是每次从未排序部分选取最小(或最大)的元素与未排序部分的第一个元素交换位置。冒泡排序则是通过相邻元素的比较和交换,逐步将最大(或最小)元素移动到数组的一端。

    如果你需要具体的排序算法实现,可以告诉我,我会为你提供代码示例。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月20日