2 排序基礎 - 4測試算法的性能

這一節 我們將實現一個很有意思 非常重要的 可以幫助我們測試算法性能的函數

要評測算法性能 最簡單的思路就是看不同算法在特定數據集上執行時間的長短(注意 需要在不同算法跑的數據集完全一致,因為數據本身結構也會影響算法執行用時)

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一. 寫在前面 要學習算法,“排序”是一個回避不了的重要話題,在分析完并查集算法和常用數據結構之后,今天我們終于可...
    Leesper閱讀 2,554評論 0 40
  • 首頁 資訊 文章 資源 小組 相親 登錄 注冊 首頁 最新文章 IT 職場 前端 后端 移動端 數據庫 運維 其他...
    Helen_Cat閱讀 3,926評論 1 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,422評論 25 708
  • 我和他都是一個農村的孩子,我,出生在一個醫學世家。他,一個帥氣而又不羈的少年,家境平常。我們相識在一個農村的學校里...
    女爺神閱讀 308評論 0 0
  • 都說世相迷離,我們常常在如煙世海中丟失了自己,而凡塵繚繞的煙火又總是嗆得你我不敢自由呼吸。千帆過盡,回首當年,那份...
    Mr米斯特兒趙閱讀 184評論 0 0