算法在之前的基础上做了改进 https://blog.csdn.net/moonlightpeng/article/details/115280300

1 前后两部分有序时不用归并了

2 当数组元素比较小时用插入排序

MergeSort.h
//
// Created by liuyubobobo on 7/21/16.
//#ifndef INC_03_MERGE_SORT_ADVANCE_MERGESORT_H
#define INC_03_MERGE_SORT_ADVANCE_MERGESORT_H#include <iostream>using namespace std;// 将arr[l...mid]和arr[mid+1...r]两部分进行归并
template<typename  T>
void __merge(T arr[], int l, int mid, int r){// 经测试,传递aux数组的性能效果并不好T aux[r-l+1];
//这儿可能会出错,如果有错则先不用模板直接用intfor( int i = l ; i <= r; i ++ )aux[i-l] = arr[i];int i = l, j = mid+1;for( int k = l ; k <= r; k ++ ){if( i > mid )   { arr[k] = aux[j-l]; j ++;}else if( j > r ){ arr[k] = aux[i-l]; i ++;}else if( aux[i-l] < aux[j-l] ){ arr[k] = aux[i-l]; i ++;}else                          { arr[k] = aux[j-l]; j ++;}}
}// 递归使用归并排序,对arr[l...r]的范围进行排序
template<typename T>
void __mergeSort(T arr[], int l, int r){if( l >= r )return;int mid = (l+r)/2;__mergeSort(arr, l, mid);__mergeSort(arr, mid+1, r);__merge(arr, l, mid, r);
}template<typename T>
void mergeSort(T arr[], int n){__mergeSort( arr , 0 , n-1 );
}#endif //INC_03_MERGE_SORT_ADVANCE_MERGESORT_H
InsertionSort.h
//
// Created by liuyubobobo on 7/16/16.
//#ifndef INC_03_MERGE_SORT_ADVANCE_INSERTIONSORT_H
#define INC_03_MERGE_SORT_ADVANCE_INSERTIONSORT_H#include <iostream>
#include <algorithm>using namespace std;template<typename T>
void insertionSort(T arr[], int n){for( int i = 1 ; i < n ; i ++ ) {T e = arr[i];int j;for (j = i; j > 0 && arr[j-1] > e; j--)arr[j] = arr[j-1];arr[j] = e;}return;
}// 对arr[l...r]范围的数组进行插入排序
template<typename T>
void insertionSort(T arr[], int l, int r){for( int i = l+1 ; i <= r ; i ++ ) {T e = arr[i];int j;for (j = i; j > l && arr[j-1] > e; j--)arr[j] = arr[j-1];arr[j] = e;}return;
}#endif //INC_03_MERGE_SORT_ADVANCE_INSERTIONSORT_H
SortTestHelper.h
//
// Created by liuyubobobo on 7/16/16.
//#ifndef INC_03_MERGE_SORT_ADVANCE_SORTTESTHELPER_H
#define INC_03_MERGE_SORT_ADVANCE_SORTTESTHELPER_H#include <iostream>
#include <algorithm>
#include <string>
#include <ctime>
#include <cassert>using namespace std;namespace SortTestHelper {int *generateRandomArray(int n, int range_l, int range_r) {int *arr = new int[n];srand(time(NULL));for (int i = 0; i < n; i++)arr[i] = rand() % (range_r - range_l + 1) + range_l;return arr;}int *generateNearlyOrderedArray(int n, int swapTimes){int *arr = new int[n];for(int i = 0 ; i < n ; i ++ )arr[i] = i;srand(time(NULL));for( int i = 0 ; i < swapTimes ; i ++ ){int posx = rand()%n;int posy = rand()%n;swap( arr[posx] , arr[posy] );}return arr;}int *copyIntArray(int a[], int n){int *arr = new int[n];copy(a, a+n, arr);return arr;}template<typename T>void printArray(T arr[], int n) {for (int i = 0; i < n; i++)cout << arr[i] << " ";cout << endl;return;}template<typename T>bool isSorted(T arr[], int n) {for (int i = 0; i < n - 1; i++)if (arr[i] > arr[i + 1])return false;return true;}template<typename T>void testSort(const string &sortName, void (*sort)(T[], int), T arr[], int n) {clock_t startTime = clock();sort(arr, n);clock_t endTime = clock();cout << sortName << " : " << double(endTime - startTime) / CLOCKS_PER_SEC << " s"<<endl;assert(isSorted(arr, n));return;}};#endif //INC_03_MERGE_SORT_ADVANCE_SORTTESTHELPER_H

算法与数据结构 第3章 高级排序算法中 归并算法改进相关推荐

  1. AcWing提高算法课Level-3 第四章 高级数据结构

    AcWing提高算法课Level-3 第四章 高级数据结构 并查集 AcWing 1250. 格子游戏1167人打卡 AcWing 1252. 搭配购买1064人打卡 AcWing 237. 程序自动 ...

  2. VLSI数字信号处理系统——第九章滤波器和变换中的算法强度缩减

    VLSI数字信号处理系统--第九章滤波器和变换中的算法强度缩减 作者:夏风喃喃 参考: (1) VLSI数字信号处理系统:设计与实现 (美)Keshab K.Parhi/著 (2) socvista ...

  3. 数据结构(七)高级排序算法——归并、快速排序

    一.归并排序 1.排序原理 归并排序算法是一种利用了分治算法思想实现的排序算法,这种排序算法是基于有序数组合并的归并排序算法的基本思想就是:判断一个待排序序列的长度,只要这个待排序序列的长度是超过1的 ...

  4. 算法与数据结构(冒泡排序,选择排序和插入排序的总结)

    冒泡排序,选择排序和插入排序的总结 在规模较小时,或者元素的有序性较高时,插入排序的时间复杂度可以接近 O(n) ,是上述三种排序里表现最好的 一.通过表格我们可以发现,冒泡排序的时间复杂度是要优于选 ...

  5. 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表

    前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...

  6. hash算法_阿里面试官:讲一下Hashmap中hash算法!

    注:本文内容全部基于jdk8讲述. 相信很多人都知道,在JDK8中,HashMap的容量总是2的n次幂,那么这么设计的目的究竟是什么呢?我可不可以将默认的初始容量从16改成20呢,扩容的时候我可不可以 ...

  7. 算法与数据结构 第四章 树与二叉树

    第四章树 一.选择题(20分) 1.在下述结论中,正确的是: (    ) ① 只有2个结点的树的度为1: ② 二叉树的度为2: ③ 二叉树的左右子树可任意交换: ④ 在最大堆(大顶堆)中,从根到任意 ...

  8. 王道数据结构课代表 - 考研数据结构 第四章 串-KMP(看毛片算法) 究极精华总结笔记(C版本)

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 串 章节知识点总结的十分全面,涵括了<王道数据结构 ...

  9. 算法与数据结构 第四章 字符串(详解)

    目录 一.判断题 二.选择题 在开始之前,先为大家推荐两篇介绍该章两个主要算法的的文章,供大家参考. KMP算法详解:KMP算法(快速模式匹配算法)C语言详解 求后缀表达式:求后缀表达式 一.判断题 ...

  10. 【数据结构与算法】之深入解析“寻找旋转排序数组中的最小值II”的求解思路与算法示例

    一.题目要求 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次旋转后,得到输入数组.例如,原数组 nums = [0, 1, 4, 4, 5, 6, 7] 在变化后可能得到: 若旋转 ...

最新文章

  1. 清华理工男,跳了7年舞,来华为一年当了PL,这什么小哥哥
  2. 2型文法:基于预测分析表的自顶向下语法分析
  3. Python3--爬取数据之911网站信息爬取
  4. uva 10047 the monocyle (四维bfs)
  5. 构造函数与折构函数(c++细节篇五)
  6. ECCV 2018 DaSiamRPN:《Distractor-aware Siamese Networks for Visual Object Tracking》论文笔记
  7. 【机器学习应用】还没期末考试,算法却说我的物理一定挂科
  8. spring自定义标签实现
  9. php接口开发 安全_PHP开发api接口安全验证的实例讲解
  10. 工信部回应“网传4G降速”:从未要求运营商降速
  11. 第一个DFS,第一个递归 HDU1515
  12. cdr转换成html格式,如何将CDR高版本转换成低版本?CDRX7文件转换成X4教程
  13. Java能用来做什么的?
  14. 堆叠沙漏网络(stacked hourglass network)
  15. 带掩码的自编码器MAE在各领域中的应用总结
  16. sudo rm-rf引发的惨案——Linux硬盘的分区和挂载
  17. LM386喇叭驱动电路
  18. echarts问题整理之多条基准线设置
  19. linux的passive用法,get的被动用法(get-passive)
  20. 重新排序(排序不等式+差分)蓝桥

热门文章

  1. 计算机桌面上的声音图标没了怎么办,电脑桌面的音量图标不见了怎么办
  2. java spring log4j_配置spring的log4j日志记录
  3. git 各种撤销操作办法
  4. mysql as 后面字段,mysql 字段as详解及实例代码
  5. 500 内部服务器错误php,如何解决php 500内部服务器错误问题
  6. vs有断点就卡死_再分享 5 个 vs 调试技巧
  7. python自建模块_python导入自建模块的问题
  8. malloc 初始化_C++核心准则NR.5:不要使用两阶段初始化
  9. Java 中 final 内存语义
  10. mySQL和oracle的数据类型区别