程序主体main.cpp

#include <iostream>
#include "Student.h"
#include "SortTestHelper.h"

using namespace std;

/** * 选择排序 * @tparam T 使用模板可以接受任意类型参数 * @param arr 待排序的数组 * @param n 数组大小 */
template<typename T>
void selectionSort(T arr[], int n) {
    for (int i = 0; i < n; i++) {
        //当前最小值的坐标
        int minIndex = i;

        //寻找从当前坐标到数组最后的最小值
        for (int j = i + 1; j < n; j++) {
            //如果找到比当前坐标还小的值 就更新坐标
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
            //交换找到的最小值和之前的最小值
            swap(arr[i], arr[minIndex]);
        }
    }

}


int main() {
    int n = 100;
    int *arr = SortTestHelper::generateRandomArray(n, 0, 100);
    /*SortTestHelper::printArray(arr, n); selectionSort(arr, n); SortTestHelper::printArray(arr, n);*/

    SortTestHelper::testSort("选择排序", selectionSort, arr, n);

    delete[] arr;
    return 0;
}

自定义结构体-Student.h

#ifndef TEST_STUDENT_H
#define TEST_STUDENT_H

#include<iostream>
#include <string>

using namespace std;

/** * 学生结构体 */
struct Student {
    //姓名
    string name;
    //分数
    int score;

    //重载<运算符
    bool operator<(const Student &otherStudent) {
        return score < otherStudent.score;
    }

    //重载输出运算符
    friend ostream &operator<<(ostream &os, const Student &student) {
        os << "name: " << student.name << " score: " << student.score << endl;
        return os;
    }
};

#endif //TEST_STUDENT_H

SortTestHelper.h

#ifndef TEST_SORTTESTHELPER_H
#define TEST_SORTTESTHELPER_H

#include <iostream>
#include <cassert>
#include <ctime>
#include <string>

using namespace std;

namespace SortTestHelper {
    /** * 生成n个随机数 * @param n 数组大小 * @param rangeL 下界 * @param rangeR 上界 * @return */
    int *generateRandomArray(int n, int rangeL, int rangeR) {
        assert(rangeL <= rangeR);
        int *arr = new int[n];
        srand(time(NULL));
        for (int i = 0; i < n; i++) {
            arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
        }
        return arr;
    }

    /** * 打印数组 * @tparam T * @param arr 接收的数组 * @param n 数组大小 */
    template<typename T>
    void printArray(T arr[], int n) {
        for (int i = 0; i < n; i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
    }

    /** * 判断数组是否有序 * @tparam T * @param arr * @param n * @return */
    template<typename T>
    bool isSorted(T arr[], int n) {
        for (int i = 0; i < n - 1; i++) {
            if (arr[i] > arr[i + 1])
                return false;
        }
        return true;
    }

    /** * 计算排序花费的时间 * @tparam T * @param sortName * @param sort * @param arr * @param n */
    template<typename T>
    void testSort(const string &sortName, void (*sort)(T [], int), T arr[], int n) {
        clock_t startTime = clock();
        sort(arr, n);
        clock_t endTime = clock();
        printArray(arr, n);
        cout << startTime << " " << endTime;
        assert(isSorted(arr, n));

        cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;

    }
}
#endif //TEST_SORTTESTHELPER_H