資料結構學習(C++)續——排序【1】測試程式 (轉)

amyz發表於2007-11-16
資料結構學習(C++)續——排序【1】測試程式 (轉)[@more@]

後面的例程,都是對陣列的排序,使用靜態連結串列的也適用於連結串列的排序。為簡單起見,只對單關鍵碼排序,並且最後的結果都是從頭到尾按升序排列。下面是統一的測試:

#include

#include

using namespace std;

#include

#include

#include

#include "InsertSort.h"

#define ran(num)  (rand() % (num))

#define randomize()  srand((unsigned)time(NULL))

#define N 10000  //排序元素的數目

#define SORT InsertSort    //排序方法

class timer//單位ms

{

public:

  void start() { start_t = clock(); }

  clock_t time() { return (clock() - start_t); }

private:

  clock_t start_t;

};

int KCN, RMN; timer TIMER;

void test(int a[])

{

  TIMER.start();

  SORT(a, N, KCN, RMN);

  cout << "tTimeSpared: " << TIMER.time() << "ms" << endl;

  cout << "KCN=" << left << setw(11) << KCN;

  cout << "KCN/N=" << left << setw(11)<< (double)KCN/N;

  cout << "KCN/N^2=" << left << setw(11)<< (double)KCN/N/N;

  cout << "KCN/NlogN=" << left << setw(11)<< (double)KCN/N/log((double)N)*log(2.0) << endl;

  cout << "RMN=" << left << setw(11) << RMN;

  cout << "RMN/N=" << left << setw(11)<< (double)RMN/N;

  cout << "RMN/N^2=" << left << setw(11)<< (double)RMN/N/N;

  cout << "RMN/NlogN=" << left << setw(11)<< (double)RMN/N/log((double)N)*log(2.0) << endl;

}

int main()

{

  int i;

//randomize();為了在相同情況下比較各個排序演算法,不加這句

  int* ascending = new int[N];//升序序列

  int* descending = new int[N];//降序序列

  int* randomness = new int[N];//隨機序列

  for (i = 0; i < N; i++) { ascending[i] = i; randomness[i] = i; descending[i] = N - i - 1;}

  for (i = 0; i < N; i++) s(randomness[i], randomness[random(N)]);

  cout << "Sort ascending  N=" << N; test(ascending);

  cout << "Sort randomness N=" << N; test(randomness);

  cout << "Sort descending N=" << N; test(descending);

  return 0;

}

需要說明一點,KCN(關鍵碼比較次數)、RMN(記錄移動次數)並不是演算法必須的,是為了對演算法的有個直觀的評價(不用那些公式算來算去)。對10000個整數排序應該是最省事的測試手段,建議不要再增多記錄數目了,一是在最壞的情況不用等太久的時間,二是避免KCN、RMN,另外有些遞迴的演算法在情況比較糟的時候,記錄數目太多堆疊可能會溢位,導致程式崩潰。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982691/,如需轉載,請註明出處,否則將追究法律責任。

相關文章