1.main.cpp 主函数
#include <iostream> #include<algorithm> #include <string> #include "SortTestHelper.h" #include "SelectionSort.h" #include "BubbleSort.h" using namespace std; //插入排序 template<typename T> void insertSort(T arr[], int n){ for (int i = 1; i < n; i++){ for (int j = i; j >= 1; j--){ if (arr[j] < arr[j-1]) swap(arr[j-1], arr[j]); else break; //提前终止循环,减少不必要的运算。当执行到此步骤时,说明前者小于后者,而前面也已经排好序。 } } } //理论上插入排序要比选择排序快,因为中间就break,但实际上耗时更长。因为频繁的swap()操作更耗时。 //改进后 template<typename T> void insertSortImprove(T arr[], int n){ for (int i = 1; i < n; i++){ T tempValue = arr[i]; int j; //保存要存放的位置 for (j = i; j >0 && arr[j - 1] > tempValue; j--){ arr[j] = arr[j - 1]; } arr[j] = tempValue; } } int main(){ int n = 10000; int *arr = SortTestHelper::generateRandomArray(n, 0, n); int *arr2 = SortTestHelper::copyIntArray(arr,n); int *arr3 = SortTestHelper::copyIntArray(arr, n); int *arr4 = SortTestHelper::copyIntArray(arr, n); SortTestHelper::testSort("Selection Sort", selectionSort, arr, n); SortTestHelper::testSort("Insert Sort", insertSort, arr2, n); SortTestHelper::testSort("Insert Sort Improve", insertSortImprove, arr3, n); SortTestHelper::testSort("Bubble Sort", bubbleSort, arr4, n); //四种算法耗时长短比较 优化的插入排序<选择排序<冒泡排序<插入排序 //这四种算法都是O(n2)级别的运算量 delete[] arr; delete[] arr2; delete[] arr3; delete[] arr4; system("pause"); return 0; }
2.SortTestHelper.h
#ifndef SELECTIONSORT_SORTTESTHELPER_H
#define SELECTIONSORT_SORTTESTHELPER_H
#include <iostream>
#include <ctime>
#include <cassert>
using namespace std;
namespace SortTestHelper{
//generateRandomArray 产生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() % (rangeL - rangeR + 1) + rangeL;
}
return arr;
}
template<typename T>
void printArray(T arr[], int n){
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return;
}
//isSorted 判断是否排序成功
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;
}
//testSort 测试排序时间
template<typename T>
void testSort(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;
}
//copyIntArray 拷贝数组
int* copyIntArray(int a[], int n){
int* copyA = new int[n];
copy(a, a + n, copyA);
return copyA;
}
}
#endif
3.SelectionSort.h 选择排序
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]); } }
4.BubbleSort.h 冒泡排序
template<typename T> void bubbleSort(T arr[], int n){ for (int i = 0; i < n - 1; i++){ for (int j = i + 1; j < n; j++){ if (arr[i]>arr[j]){ swap(arr[i], arr[j]); } } } }