数据结构算法学习总结-慕课网(二)选择排序执行时间,正确性(从小到大)
1.思路
执行时间:只需要记录排序之前的时间,排序之后的时间,然后两者相减就可以的排序所需的时间
正确性:循环数组中的元素,如果有数组中的前一个元素比后一个元素要大,则该排序算法不正确,否则正确
注意角标,如果越界可能出现不可预知的错误的
2.代码
SortTestHelper.h
#ifndef SORTTESTHELPER_H_ #define SORTTESTHELPER_H_ #include <iostream> #include <ctime> #include <cassert> using namespace std; namespace SortTestHelper{ //生成n个元素的随机数组,每个元素的随机范围为[rangeL,rangeR] int* generateRandomArray(int n,int rangeL,int rangeR){ assert(rangeL <= rangeR); //为了程序稳定性,如果rangeL>rangeR,那么程序不会往下执行 int *arr = new int[n]; srand(time(NULL));//随机种子,需要导入ctime库 for(int i = 0;i<n;i++){ arr[i] = rand() % (rangeR - rangeL + 1) + rangeL; //自己可以动笔算一下 } return arr; } /** * 检验排序的正确性 */ template<typename T> bool isSorted(T arr[],int n){ for(int i = 0;i<n;i++){ //注意,如果i=n-2时,实际上会比较arr[n-2]和arr[n-1]的值,此时数组已经比较完毕 if(i<n-1 && arr[i]>arr[i+1]){ return false; } } return true; } /** * 测试排序所需要的时间 */ template<typename T> void testSort(string sortName,void(*sort)(T arr[],int n),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 /* SORTTESTHELPER_H_ */
SelectionSort.cpp
#include <iostream> #include "Student.h" #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[minIndex],arr[i]);//把a,b交换位置 } } template<typename T> void printArray(T arr[],int n){ for(int i = 0;i<n;i++) cout << arr[i] << " "; //循环打印数组中的元素 cout << endl; } int main() { int n = 100000; int *arr = SortTestHelper::generateRandomArray(n,1,100); SortTestHelper::testSort("Selection Sort",selectionSort,arr,n); delete[] arr;//new的方式开辟数组空间,防止内存泄漏 return 0; }