數據結構與算法複習-選擇排序-C++實現

程序主體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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章