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

main.cpp

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

SortTestHelper.h

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

    上面我们创建了后端是 hostPath 类型的 PV 资源对象,我们也提到了,使用 hostPath 有一个局限性就是,我们的 Pod 不能随便漂移,需要固定到一个节点上,因为一旦漂移到其他节点上去了 ...

  2. Elasticsearch索引模板-转载

    转载地址:https://dongbo0737.github.io/2017/06/13/elasticsearch-template/#similar_posts Elasticsearch索引模板 ...

  3. Python基础(二十):面向对象“类”第三课——类成员

    知识点: 类属性与实例属性: 类方法与实例方法: 静态方法: 类属性与实例属性 类属性与实例属性的区别 属性的绑定不同 类属性与当前类相关(绑定的是当前类),与当前类创建的任何对象无关: 实例属性与当 ...

  4. Linux就该这么学:重定向,管道符,通配符,转义符,环境变量

    第三章:重定向,管道符,环境变量 3.1 输入输出重定向 定义:输入重定向是指将文件导入命令中,输出重定向是指将原本显示到屏幕的信息输出问文件.相较于输入重定向,输出重定向使用的更多,下面重点介绍输出 ...

  5. Unity2D项目-平台、解谜、战斗! 1.5 Player框架、技能管理组件

    各位看官老爷们,这里是RuaiRuai工作室,一个做单机游戏的兴趣作坊. 前文提到,凡是有"攻击"语义的对象,在游戏中,我们给予其一个"CanFight"组件予 ...

  6. irreader网页订阅

    flag:立刻阅读,订阅你的全世界 订阅网页.RSS和Podcast,具备急速的阅读体验,高品质.免费.无广告.多平台的阅读器.泛用型Podcast播放器. 下载位置:http://irreader. ...

  7. Go-06-数据类型、常量、运算符

    数据类型转换 Go语言采用数据类型前置加括号的方式进行类型转换,格式如:T(表达式).T表示要转换的类型:表达式包括变量.数值.函数返回值等. var a int =100 b := float(a) ...

  8. 《C++ primer》学习笔记整理

    简介 本笔记目前已包含<C++ Primer>中的绝大部分内容,但尚有部分小节有所缺漏,如 19.1.19.2 节的笔记尚未整理,会持续更新. 本项目中的学习笔记是在学完一章内容后,对其要 ...

  9. 三. 初步认识Eureka注册中心

    Eureka Eureka是Netflix公司出品,英文直译:发现了,找到了! 认识Eureka (一)首先我们来解决第一问题,服务的管理. Ⅰ.早期开发模式中出现的问题 再早期开发时业务时,首先模块 ...

  10. 基于MATLAB的手写公式识别(6)

    基于MATLAB的手写公式识别 2021-03-29 10:24:51 走通了程序,可以识别"心脑血管这几个字",还有很多不懂的地方. 2021-03-29 12:20:01 tw ...