选择排序、插入排序、归并排序

main.cpp

  1. 1 #include <iostream>
  2. 2 #include "Student.h"
  3. 3 #include "SortTestHelper.h"
  4. 4
  5. 5 using namespace std;
  6. 6
  7. 7 template<typename T>
  8. 8 void selectionSort(T arr[],int n){
  9. 9 for(int i = 0 ; i < n ; i ++){
  10. 10 int minIndex = i;
  11. 11 for( int j = i + 1 ; j < n ; j ++ )
  12. 12 if( arr[j] < arr[minIndex] )
  13. 13 minIndex = j;
  14. 14 swap( arr[i] , arr[minIndex] );
  15. 15 }
  16. 16 }
  17. 17
  18. 18 template<typename T>
  19. 19 void insertionSort(T arr[],int n){
  20. 20 for(int i = 1 ; i < n ; i++ ){
  21. 21 T e = arr[i];
  22. 22 int j;
  23. 23 for(j = i ; j > 0 && arr[j-1] > e ; j --)
  24. 24 arr[j] = arr[j-1];
  25. 25 arr[j] = e;
  26. 26 }
  27. 27 }
  28. 28
  29. 29 template<typename T>
  30. 30 // 将arr[l...mid]和arr[mid+1...r]两部分进行归并
  31. 31 void __merge(T arr[] , int l, int mid, int r){
  32. 32 T aux[r-l+1];
  33. 33 // 将数组复制一份到aux[]
  34. 34 for( int i = l ; i <= r ; i ++ )
  35. 35 aux[i-l] = arr[i];
  36. 36 // 初始化,i、j指向左、右半部分的起始索引位置
  37. 37 int i = l, j = mid + 1;
  38. 38 for( int k = l ; k <= r ; k ++ ){
  39. 39 // 如果左半部分已处理完毕
  40. 40 if( i > mid){
  41. 41 arr[k] = aux[j-l];
  42. 42 j++;
  43. 43 }
  44. 44 // 如果右半部分已处理完毕
  45. 45 else if( j > r){
  46. 46 arr[k] = aux[i-l];
  47. 47 i ++;
  48. 48 }
  49. 49 // 左半部分所指元素 < 右半部分所指元素
  50. 50 else if( aux[i-l] < aux[j-l] ){
  51. 51 arr[k] = aux[i-l];
  52. 52 i ++;
  53. 53 }
  54. 54 // 左半部分所指元素 >= 右半部分所指元素
  55. 55 else{
  56. 56 arr[k] = aux[j-l];
  57. 57 j++;
  58. 58 }
  59. 59 }
  60. 60 }
  61. 61
  62. 62 // 递归使用归并排序,对arr[l...r]的范围进行排序
  63. 63 template<typename T>
  64. 64 void __mergeSort(T arr[] , int l, int r){
  65. 65
  66. 66 if( l >= r)
  67. 67 return;
  68. 68
  69. 69 int mid = (l+r)/2;
  70. 70 __mergeSort(arr,l,mid);
  71. 71 __mergeSort(arr,mid+1,r);
  72. 72 __merge(arr, l, mid, r);
  73. 73 }
  74. 74
  75. 75 template<typename T>
  76. 76 void mergeSort(T arr[] , int n){
  77. 77 __mergeSort( arr , 0 , n-1 );
  78. 78 }
  79. 79
  80. 80 int main(){
  81. 81 int n = 10000;
  82. 82 //int *arr = SortTestHelper::generateNearlyOrderedArray(n,10);
  83. 83 int *arr1 = SortTestHelper::generateRandomArray(n,0,n);
  84. 84 int *arr2 = SortTestHelper::copyIntArray(arr1, n);
  85. 85 SortTestHelper::testSort("Insertion Sort",insertionSort,arr1,n);
  86. 86 SortTestHelper::testSort("Merge Sort",mergeSort,arr2,n);
  87. 87
  88. 88 delete[] arr1;
  89. 89 delete[] arr2;
  90. 90
  91. 91 return 0;
  92. 92 }

SortTestHelper.h

  1. 1 #include <iostream>
  2. 2 #include <ctime>
  3. 3 #include <cassert>
  4. 4 #include <string>
  5. 5
  6. 6 using namespace std;
  7. 7
  8. 8 namespace SortTestHelper{
  9. 9 // 生成随机数组
  10. 10 int *generateRandomArray(int n,int rangeL,int rangeR){
  11. 11 assert(rangeL <= rangeR);
  12. 12 int *arr = new int[n];
  13. 13 srand(time(NULL));
  14. 14 for(int i = 0 ; i < n ; i++)
  15. 15 arr[i] = rand()%(rangeR-rangeL+1) + rangeL;
  16. 16 return arr;
  17. 17 }
  18. 18 // 生成近似有序数组
  19. 19 int *generateNearlyOrderedArray(int n, int swapTimes){
  20. 20 int *arr = new int[n];
  21. 21 for(int i = 0 ; i < n ; i ++ )
  22. 22 arr[i] = i;
  23. 23 srand(time(NULL));
  24. 24 for( int i = 0 ; i < swapTimes ; i ++){
  25. 25 int posx = rand()%n;
  26. 26 int posy = rand()%n;
  27. 27 swap( arr[posx] , arr[posy] );
  28. 28 }
  29. 29 return arr;
  30. 30 }
  31. 31
  32. 32 // 拷贝整型数组a中所有元素到新数组并返回
  33. 33 int *copyIntArray(int a[], int n){
  34. 34 int *arr = new int[n];
  35. 35 copy(a, a+n, arr);
  36. 36 return arr;
  37. 37 }
  38. 38
  39. 39 // 打印arr数组的所有内容
  40. 40 template<typename T>
  41. 41 void printArray(T arr[],int n){
  42. 42 for(int i = 0;i<n;i++)
  43. 43 cout << arr[i] <<" ";
  44. 44 cout << endl;
  45. 45 return;
  46. 46 }
  47. 47
  48. 48 // 判断arr数组是否有序
  49. 49 template<typename T>
  50. 50 bool isSorted(T arr[],int n){
  51. 51 for(int i = 0 ; i<n-1 ; i++)
  52. 52 if(arr[i] > arr[i+1])
  53. 53 return false;
  54. 54 return true;
  55. 55 }
  56. 56
  57. 57 // 测试sort排序算法排序arr数组所得结果的正确性和算法运行时间
  58. 58 template<typename T>
  59. 59 void testSort(const string &sortName,void (*sort)(T[],int),T arr[],int n){
  60. 60
  61. 61 clock_t startTime = clock();
  62. 62 sort(arr,n);
  63. 63 clock_t endTime = clock();
  64. 64
  65. 65 assert(isSorted(arr,n));
  66. 66
  67. 67 cout << sortName << " : " << double(endTime-startTime)/CLOCKS_PER_SEC << " s" <<endl;
  68. 68
  69. 69 return;
  70. 70 }
  71. 71 }

运行结果:

Merge Sort可在1s内轻松处理100万数量级的数据

[算法] O(nlogn)和O(n^2)算法性能比较的更多相关文章

  1. java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

  2. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  3. EM算法(2):GMM训练算法

    目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法运用 EM算法(4):EM算法证明 EM算法(2):GMM训练算法 1. 简介 GMM模型全称为Ga ...

  4. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

  5. 70 数组的Kmin算法和二叉搜索树的Kmin算法对比

    [本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Km ...

  6. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  7. 字符串查找算法总结(暴力匹配、KMP 算法、Boyer-Moore 算法和 Sunday 算法)

    字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Mo ...

  8. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现

    选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...

  9. 经典算法研究系列:二、Dijkstra 算法初探

    July   二零一一年一月 本文主要参考:算法导论 第二版.维基百科. 一.Dijkstra 算法的介绍 Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到 ...

随机推荐

  1. 利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理

    在我们开发Web API应用的时候,我们可以借鉴ABP框架的过滤器Filter和特性Attribute的应用,实现对Web API返回结果的封装和统一异常处理,本篇随笔介绍利用AuthorizeAtt ...

  2. ClickHouse性能优化?试试物化视图

    一.前言 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS):目前我们使用CH作为实时数仓用于统计分析,在做性能优化的时候使用了 物化视图 这一特性作为优化手段,本文主 ...

  3. 记录给树莓派刷Raspberry Pi OS(Raspbian)系统的配置流程

    准备材料 树莓派(一定要贴散热片,最好再加个小风扇) TF内存卡 (记得选传输规范为Class10标准的) 读卡器 电脑(这里我使用的电脑是Windows系统,其它系统可能与下面的步骤有出入,还望悉知 ...

  4. ubuntu20.04开机显示recovering journal死机的解决方法

    事发突然,在今天开机的时候无法进入登陆界面,一直卡在黑屏界面,屏幕上只显示几行代码,且任何按键都无法起作用 /dev/sdb2:recovering journal /dev/sdb2:Clearin ...

  5. [Azure DevOps] 如何安装并配置 Build Agent

    1. 编译服务器 在 Azure Pipelines 中至少需要一个编译服务器的 Agent 才能编译代码或发布软件.Azure DevOps 本身已经提供了一个 Agent,但出于各种理由(需要特殊 ...

  6. Kubernetes删除一直处于Terminating状态的namespace

    问题现象: 删除namespace,一直处于Terminating,并且用--force --grace-period=0 也删除不了 develop Terminating 4d9h Error f ...

  7. 并发编程之ThreadLocal

    并发编程之ThreadLocal 前言 当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这 ...

  8. 这一次,彻底搞懂 Go Cond

    hi,大家好,我是 haohongfan. 本篇文章会从源码角度去深入剖析下 sync.Cond.Go 日常开发中 sync.Cond 可能是我们用的较少的控制并发的手段,因为大部分场景下都被 Cha ...

  9. Day 12_61_多线程的创建和启动(二)

    多线程的创建和启动 * 在java中实现多线程的第二种方法 实现java.lang.Runnable接口,重写run()方法 * 推荐使用这种方式,因为实现接口还可以保留类的继承. package c ...

  10. Day01_06_Java注释

    Java注释 注释 - 单行注释:// xxxxx - 多行注释:/* xxxxx */ - javadoc注释: /** * * * */ - javadoc注释可以被bin目录下的javadoc. ...