关于#c++#的问题:利用模板封装一个函数mysort(),对不同数据类型的数组进行有由小到大的冒泡排序,并在主函数中用整型数组进行测试并输出结果

利用模板封装一个函数mysort(),对不同数据类型的数组进行有由小到大的冒泡排序,并在主函数中用整型数组进行测试并输出结果

可以使用函数模板来封装mysort()函数,以对不同类型的数组进行排序。以下是一个示例实现:

#include <iostream>
using namespace std;

template <typename T>
void mysort(T arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                T temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {5, 1, 4, 2, 8};
    int n = sizeof(arr)/sizeof(arr[0]);

    mysort(arr, n);

    cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

在这个例子中,我们定义了一个函数模板mysort(),它接受一个泛型数组和数组的大小作为参数。该函数使用冒泡排序算法对数组进行排序,以保证数组中的元素按升序排列。

在主函数中,我们声明了一个整型数组,并使用mysort()函数对其进行排序。最后,我们输出已排序的数组元素,以验证mysort()函数是否按预期工作。

注意,如果要对其他类型的数组进行排序,只需要用该类型的数据类型替换mySort()函数的模板参数T即可。

  • 如下为优化版的 从小到大的冒泡排序, 可查看 代码中备注了解一下:
  • 分别用 int ,double ,char 等类型的数组测试。
#include <iostream>
using namespace std;

template<typename T>
void sort1(T a[], int len);

int main()
{
    int i;
    int a[5] = {3, 5, 2, 4, 1};
    double b[5] = {4.2, 7.4, 3.4, 2.3, 5.4};
    char c[5] = {'c', 'a', 'g', 'e', 'd'};
    mysort(a, 5);
    mysort(b, 5);
    mysort(c, 5);
    for(i = 0; i < 5; i++) 
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    for(i = 0; i < 5; i++) 
    {
        printf("%.2lf ", b[i]);
    }
    printf("\n");
    for(i = 0; i < 5; i++) 
    {
        printf("%c ", c[i]);
    }
    return 0;
}

template<typename T>
void mysort(T a[], int len)
{
    int i, j;
    T t;
    for(i = 0; i < len - 1; i++) 
    {
        int flag = 0; // 是否冒泡标识
        for(j = 0; j < len - i - 1; j++)
        {
            if (a[j] > a[j + 1]) // 从小到大冒泡
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
                flag = 1; // 冒过泡了
            }
        }
        if (!flag) // 都没有冒泡,说明已排序好,直接跳出循环 
            break;
    }
}