• 插入排序改进 将交换变成赋值语句 优点适用于近乎有序的序列


    效果非常的明显

    下面给出代码截图

    再给出原代码

    1. #include
    2. #include
    3. #include "Student.h"
    4. #include "sorttesthelper.h"
    5. using namespace std;
    6. template<typename T >
    7. void selectionSort( T arr[], int n){
    8. for(int i = 0 ; i < n ; i++){
    9. //寻找【i,n之间的最小值】
    10. int minIndex = i;
    11. for( int j = i + 1 ; j < n ; j++)
    12. if(arr[j] < arr[minIndex] )
    13. minIndex = j;
    14. swap( arr[i] , arr[minIndex]);
    15. }
    16. }
    17. //对插入排序来说,直接从第二个元素开始
    18. template<typename T >
    19. void InsertSort( T arr[], int n){
    20. for(int i = 1 ; i < n ; i++){
    21. T e = arr[i];
    22. // j 需要保存元素e应该插入的位置
    23. int j;
    24. //寻找【i应该插入的位置】,但是注意我们是从后面往前找所以j 要从后往前
    25. // for( int j = i ; j > 0 ; j --)
    26. // if(arr[j] < arr[j - 1] )
    27. // swap(arr[j], arr[j-1]);
    28. // else
    29. // break;
    30. //插入排序的优点是 可以提前 终止循环 所以对于几乎有序的序列 插入排序的性能非常强
    31. for( j = i ; j > 0 && arr[j-1] > arr[e]; j --)
    32. arr[j] = arr[j-1];
    33. arr[j] = arr[e];
    34. }
    35. }
    36. int main()
    37. {
    38. int a[5] = {5,62,3,58,44};
    39. selectionSort( a, 5 );
    40. for( int i = 0 ; i < 5 ; i++)
    41. cout<" ";
    42. cout<
    43. float b[4] = {4.4,2.3,5.63};
    44. selectionSort( b , 3);
    45. for( int i = 0 ; i < 3 ; i++)
    46. cout<" ";
    47. cout<
    48. string c[2] = {"z","b"};
    49. selectionSort( c , 2);
    50. for( int i = 0 ; i < 2 ; i++)
    51. cout<" ";
    52. cout<
    53. Student d[3] = {{"D",90} , {"C",89} , { "B", 114}};
    54. selectionSort( d , 3);
    55. for( int i = 0 ; i < 3 ; i++)
    56. cout<
    57. cout<
    58. int n = 100000;
    59. int *arr = SortTestHelper :: generateRandomArr(n, 0, n) ;
    60. int *arr2 = SortTestHelper :: copyIntArray(arr, n);
    61. int *arr3 = SortTestHelper :: generateNearlyorderedArr(n, 100);
    62. // InsertSort(arr2, n);
    63. // SortTestHelper :: printarr(arr2, n);
    64. // selectionSort( arr, n );
    65. // SortTestHelper :: printarr(arr, n);
    66. // SortTestHelper::test_sort("selection Sort", selectionSort, arr,n);
    67. SortTestHelper::test_sort("Insertion Sort", InsertSort, arr2,n);
    68. SortTestHelper::test_sort("Insertion Sort a nearly ordered arr", InsertSort, arr3,n);
    69. delete[] arr;
    70. delete[] arr2;
    71. return 0;
    72. }

    给出辅助文件

    1. #ifndef SORT_HELPER_H
    2. #define SORT_HELPER_H
    3. //解决ide.h文件的多重引用的问题
    4. #include
    5. #include
    6. #include
    7. #include
    8. using namespace std;
    9. namespace SortTestHelper{
    10. //生成n个元素的随机数组,每个元素的随机范围为【rangeL, rangeR】
    11. int* generateRandomArr(int n, int rangeL, int rangeR){
    12. assert( rangeL <= rangeR );
    13. int *arr = new int[n];
    14. //设置随机种子
    15. srand(time(NULL));
    16. for(int i = 0; i < n ;i ++)
    17. arr[i] = rand()%(rangeR - rangeL + 1) + rangeL;
    18. return arr;
    19. }
    20. int* generateNearlyorderedArr(int n, int swaptimes){
    21. int *arr = new int[n];
    22. for(int i = 0; i < n ;i ++)
    23. arr[i] = i;
    24. //设置随机种子
    25. srand(time(NULL));
    26. for(int i = 0; i < swaptimes ; i ++){
    27. int posx = rand()%n;
    28. int posy = rand()%n;
    29. swap( arr[posx], arr[posy] );
    30. }
    31. return arr;
    32. }
    33. template<typename T >
    34. void printarr(T arr[], int n){
    35. for( int i = 0 ; i < n ; i++)
    36. cout<" ";
    37. cout<
    38. return;
    39. }
    40. //我们也希望写一个辅助函数来帮我们判断 函数的正确性
    41. template<typename T >
    42. bool isSorted(T arr[], int n){
    43. for (int i = 0; i < n - 1; i++)
    44. if (arr[i]> arr[i+1])
    45. return false;
    46. return true;
    47. }
    48. template<typename T >
    49. // 我们希望之后传入的都是函数名字 指针和测试用例
    50. void test_sort( string sortNmae, void(*sort)(T[], int), T arr[], int n){
    51. clock_t startTime = clock();
    52. sort(arr,n);
    53. clock_t endTime = clock();
    54. assert( isSorted(arr, n ));
    55. //每一秒中时钟周期运行的个数 最后输出的程序 运行的多少秒
    56. cout<< sortNmae << " : "<<double(endTime - startTime)/ CLOCKS_PER_SEC << " s " <
    57. return;
    58. }
    59. int* copyIntArray(int a[], int n){
    60. int* arr = new int[n];
    61. copy(a, a + n, arr);
    62. return arr;
    63. }
    64. }
    65. #endif //SORT_HELPER_H

  • 相关阅读:
    C语言_编译前的预处理
    E 排队(排列组合)[牛客小*白月赛61]
    基于gewe制作第一个微信聊天机器人
    MCollections——17
    原型模型(clone()和拷贝构造器之间的选择)
    手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集
    Delphi IdTcpServer IdTcpClient 传输简单文本
    SPDK NVMe Reservation使用简介
    【QT进阶】Qt http编程之nlohmann json库使用的简单介绍
    An2021软件安装及基本操作(新建文件/导出)
  • 原文地址:https://blog.csdn.net/qq_68308828/article/details/133930034