zoukankan      html  css  js  c++  java
  • 插入排序、选择排序的实现与性能比较

    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 }
  • 相关阅读:
    2020年-测试流程学习
    Jmeter接口测试2020(1)
    elk
    redis
    RabbitMQ
    memcache集群
    mysql安装
    mysql从的配置文件
    memcache
    keepalived
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/7242432.html
Copyright © 2011-2022 走看看