插入排序、选择排序的实现与性能比较
SortTestHelper.h
1 #ifndef INSERTIONSORT_SORTTESTHELPER_H 2 #define INSERTIONSORT_SORTTESTHELPER_H 3 #include <iostream> 4 #include <algorithm> 5 #include <string> 6 #include <ctime> 7 #include <cassert> 8 9 using namespace std; 10 11 //辅助排序测试 12 namespace SortTestHelper{ 13 14 //生成有n个元素的随机数组,每个元素的随机范围为[rangL,rangR] 15 int* generateRandomArray(int n,int rangL,int rangR){ 16 //默认rangL要小于rangR 17 assert(rangL <= rangR ); 18 int* arr = new int[n]; 19 20 //设置随机种子:将当前时间作为种子来进行随机数的设置 21 srand(time(NULL)); 22 23 for (int i = 0; i < n; i++) 24 //惯用的随机数生成式,生成一个范围在rangL---rangR的随机数 25 arr[i] = rand() % (rangR - rangL + 1) + rangL; 26 return arr; 27 } 28 29 //打印函数,用来打印各种类型下的数组 30 template<typename T> 31 void printArray(T arr[],int n){ 32 for (int i = 0; i < n; i++) 33 cout << arr[i] << " "; 34 cout << endl; 35 return 0; 36 } 37 38 //经过排序算法排序后,再次确认是否已经完全排序 39 template<typename T> 40 bool isSorted(T arr[], int n) { 41 42 for (int i = 0; i < n - 1; i++) 43 if (arr[i] > arr[i + 1]) 44 return false; 45 46 return true; 47 } 48 49 //衡量一个算法的性能如何,最简单的方式就是看这个算法在特定数据集上的执行时间 50 //(1)传入排序算法的名字,方便打印输出 51 //(2)传入排序算法本身,即函数指针 52 //(3)传入测试用例:数组和元素个数 53 template<typename T> 54 void testSort(const string &sortName, void(*sort)(T[], int), T arr[], int n){ 55 56 //在排序前后分别调用clock()函数 57 //时间差就是该排序算法执行的时钟周期的个数 58 clock_t startTime = clock(); 59 sort(arr,n); 60 clock_t endTime = clock(); 61 62 //判断是否有序,不有序则直接退出 63 assert(isSorted(arr,n)); 64 65 //endTime 减去 startTime 转为double类型,除以 CLOCKS_PER_SEC,其中: 66 //CLOCKS_PER_SEC 是标准库中定义的一个宏,表示每一秒钟所运行的时钟周期 67 //的个数,而(endTime-startTime)返回的是运行了几个时钟周期 68 //这样,最终的结果就是在这段时间中程序执行了多少秒 69 cout << sortName << ":" << double(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl; 70 return; 71 } 72 73 //拷贝数组函数 74 int *copyIntArray(int a[],int n){ 75 int *arr = new int[n]; 76 //copy()函数在命名空间std中: 77 //第一个参数是原数组的头指针, 78 //第二个参数是原数组的尾指针, 79 //第三个参数是目的数组的头指针 80 81 //注意:copy()函数运行时会报错,需要在: 82 //项目->属性->配置属性->C/C++->预处理器->预处理器定义 83 //在其中添加:_SCL_SECURE_NO_WARNINGS 84 copy(a,a+n,arr); 85 /*for (int i = 0; i < n; i++) 86 arr[i] = a[i];*/ 87 return arr; 88 } 89 } 90 91 #endif
SelectionSort.h
1 #ifndef INSERTION_SELECTIONSORT_H 2 #define INSERTION_SELECTIONSORT_H 3 4 //选择排序 5 template<typename T> 6 void selectionSort(T arr[], int n){ 7 8 for (int i = 0; i < n; i++){ 9 10 int minIndex = i; 11 for (int j = i + 1; j < n; j++) 12 if (arr[j] < arr[minIndex]) 13 minIndex = j; 14 15 swap(arr[i], arr[minIndex]); 16 } 17 } 18 19 #endif
InsertionSort.h
1 #ifndef INSERTIONSORT_INSERTION_H 2 #define INSERTIONSORT_INSERTION_H 3 4 //插入排序 5 template<typename T> 6 void insertionSort(T arr[], int n){ 7 for (int i = 0; i < n; i++){ 8 for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) 9 swap(arr[j], arr[j - 1]); 10 } 11 12 //写法2: 13 //for (int j = i; j > 0; j--) 14 //{ 15 // if (arr[j] < arr[j - 1]) 16 // { 17 // swap(arr[j], arr[j - 1]); 18 // } 19 // else 20 // { 21 // //当arr[i]插入到合适位置后,就跳出当前循环 22 // //继续对下一个元素进行考察 23 // break; 24 // } 25 //} 26 27 } 28 29 #endif
main.cpp
1 #include <iostream> 2 #include <algorithm> 3 #include "SortTestHelper.h" 4 #include "InsertionSort.h" 5 #include "SelectionSort.h" 6 using namespace std; 7 8 int main(){ 9 int n = 10000; 10 int *arr = SortTestHelper::generateRandomArray(n,0,n); 11 int *arr2 = SortTestHelper::copyIntArray(arr,n); 12 13 //对同一数组进行插入排序所用时间: 14 SortTestHelper::testSort("Insertion Sort",insertionSort,arr,n); 15 //对同一数组进行选择排序所用时间: 16 SortTestHelper::testSort("Selection Sort", selectionSort, arr2, n); 17 18 delete[] arr; 19 delete[] arr2; 20 return 0; 21 }