首页 > 代码库 > 插入排序、选择排序的实现与性能比较

插入排序、选择排序的实现与性能比较

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 }

 

插入排序、选择排序的实现与性能比较