測試算法時,經常使用隨機數,針對排序算法測試,建立一個名字空間SortTestHelper
1 namespace SortTestHelper 2 { 3 int* generateRandomArray(int n,int rangeL,int rangeR);//生成隨機數組 4 void printArray(int *arr,int n);//打印數組 5 template<typename T> bool isSorted(T *arr,int n);//判斷是否成功排序 6 template<typename T> void testSort(string sortName,void(*sort)(T [],int),T arr[],int n);//測試排序時間並打印 7 }
生成隨機數組時,三個參數分別為元素個數,元素下限和元素上限。
在這個函數中,默認rangR>rangeL,所以在函數中使用了assert(rangeR>rangeL),如果括號內成立,則繼續運行,不成立則打斷。
生成隨機數的方式是使用srand和rand()配合產生偽隨機數序列,rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的“隨機”。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列。
1 //生成有n個元素的隨機數組,每個數組元素范圍為[rangeL,rangeR] 2 int* generateRandomArray(int n,int rangeL,int rangeR) 3 { 4 assert(rangeR>rangeL); 5 int *arr=new int[n]; 6 srand(time(NULL)); 7 for(int i=0;i<n;i++) 8 arr[i]=rand()%(rangeR-rangeL+1)+rangeL; 9 return arr; 10 } 11 12 void printArray(int *arr,int n) 13 { 14 for(int i=0;i<n;i++) 15 cout<<arr[i]<<" "; 16 cout<<endl; 17 }
在使用隨機數組生成函數后,為數組分配了地址空間,在測試結束后要加delete[] arr,否則會造成內存泄漏。
判斷數組是否排序成功時,構造成了函數模板,進行n-1次循環,如果存在某個元素比其后一個元素大,則返回錯誤
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; }
測試排序時間時,使用了clock()函數,clock()是C/C++中的計時函數,而與其相關的數據類型是clock_t。
clock tick:時鍾計時單元(而不把它叫做時鍾滴答次數),一個時鍾計時單元的時間長短是由CPU控制的,一個clock tick不是CPU的一個時鍾周期,而是C/C++的一個基本計時單位。而與之對應的宏CLOCKS_PER_SEC適用於將計算系統時間類型轉換為用戶可讀的秒時間,包含於頭文件ctime中。
1 template<typename T> 2 void testSort(string sortName,void(*sort)(T[],int),T arr[],int n) 3 { 4 clock_t startTime=clock(); 5 sort(arr,n); 6 clock_t endTime=clock(); 7 8 assert(isSorted(arr, n)); 9 cout<<sortName<<":"<<double(endTime-startTime)/CLOCKS_PER_SEC<<"s"<<endl; 10 return; 11 }
在函數中,使用了assert()來確定數組是否排序成功,如果成功則繼續運行,不成功則打斷。