這一節 我們將實現一個很有意思 非常重要的 可以幫助我們測試算法性能的函數
要評測算法性能 最簡單的思路就是看不同算法在特定數據集上執行時間的長短(注意 需要在不同算法跑的數據集完全一致,因為數據本身結構也會影響算法執行用時)
C++代碼:
SortTestHelper.h:
#ifndef INC_03_SELECTION_SORT_DETECT_PERFORMANCE_SORTTESTHELPER_H
#define INC_03_SELECTION_SORT_DETECT_PERFORMANCE_SORTTESTHELPER_H
#include <iostream>
#include <ctime>
#include <cassert>
#include <string>
using namespace std;
namespace SortTestHelper {
// 生成有n個元素的隨機數組,每個元素的隨機范圍為[rangeL, rangeR]
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;
}
// 打印arr數組的所有內容
template<typename T>
void printArray(T arr[], int n) {
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return;
}
// 判斷arr數組是否有序
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;
}
// 測試sort排序算法排序arr數組所得到結果的正確性和算法運行時間
// * 使用VS編碼的同學, 對于函數指針的寫法和調用方法可能和課程中介紹的有所不同;
// * 并且不同版本的VS, 其具體語法可能也有差異, 這是因為VS的編譯器不完全是按照C++的標準實現的;
// * 本課程按照C++11的標準進行書寫。對于VS編譯器帶來的語法差異, 希望同學們可以自己在網上查找相關資料解決;
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();
assert(isSorted(arr, n));
cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s" << endl;
return;
}
};
#endif //INC_03_SELECTION_SORT_DETECT_PERFORMANCE_SORTTESTHELPER_H
main.cpp:
#include <iostream>
#include "SortTestHelper.h"
using namespace std;
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 = 100000;
int *arr = SortTestHelper::generateRandomArray(n, 0, n);
SortTestHelper::testSort("Selection Sort", selectionSort, arr, n);
delete[] arr;
return 0;
}
C++結果:
(輸出對含有100000個元素的數組排序用時12秒排序完成)
排序用時.png