处理海量数据的高级排序之——归并排序(C++)
代码实现
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std; int a[];
int tempA[]; #define BEGIN_RECORD \
{ \
clock_t ____temp_begin_time___; \
____temp_begin_time___=clock(); #define END_RECORD(dtime) \
dtime=float(clock()-____temp_begin_time___)/CLOCKS_PER_SEC;\
} /*
归并排序的合并过程
a - 待排序数组
l - 排序区域左边界
m - 排序区域中点
r - 排序区域右边界
*/
void merge(int a[], int l, int m, int r)
{
int i = l;
int j = m+;
int k; //int tempA[100000]; //空间复杂度O(n),在最后一次合并需要用到n个临时存储空间 //将两个有序排序区域合并成一个有序区域
//part1:两排序区域都从索引N(0,1...n)开始比较大小,取较小的值push进临时数组,同时该排序区域比较索引+1;当任一排序区域的值取完后,结束part1
for (k = l; i <= m && j <= r; k++)
{
if(a[i] <= a[j])
{
tempA[k] = a[i++];
}
else
{
tempA[k] = a[j++];
}
} //part2:将另一排序区域剩余的值按有序push进临时数组。此时临时数组为合并的有序区域。结束part2
if(i <= m)
for (; k <= r; k++)
tempA[k] = a[i++];
if(j <= r)
for (; k <= r; k++)
tempA[k] = a[j++]; //part3:将临时数组数据拷贝到原数组。排序结束
for (int k = l; k <= r; k++)
{
a[k] = tempA[k];
} } /**
归并排序
时间复杂度O(n*logn),
空间复杂度O(n)
在需要稳定排序的情况下,归并排序是最
在不考虑稳定性的情况下,归并排序由于需要O(n)的临时存储空间,比较耗费内存,效果不如快速排序
*/
void mergeSort(int a[], int l, int r)
{
int m; if(l < r)
{
m = (l + r)/;
//递归分解的过程,细分区域直到每个区域元素个数小于等于2
mergeSort(a, l, m-);
mergeSort(a, m+, r);
//归并过程
merge(a, l, m, r);
}
} void printArray(int a[], int length)
{
cout << "数组内容:";
for(int i = ; i < length; i++)
{
if(i == )
cout << a[i];
else
cout << "," << a[i]; }
cout << endl;
} int _tmain(int argc, _TCHAR* argv[])
{
float tim; for (int i = ; i < ; i++)
{
a[i] = int(rand() % );
} BEGIN_RECORD //printArray(a, sizeof(a)/sizeof(int));
mergeSort(a, , sizeof(a)/sizeof(int)-);
//printArray(a, sizeof(a)/sizeof(int)); END_RECORD(tim) cout << "运行时间:" << tim << "s" << endl; system("pause");
return ;
}
归并过程


处理海量数据的高级排序之——归并排序(C++)的更多相关文章
- 处理海量数据的高级排序之——希尔排序(C++)
希尔算法简介 ...
- 处理海量数据的高级排序之——堆排序(C++)
在面对大数据量的排序时(100W以上量级数据),通常用以下三种的排序方法效率最高O(nlogn):快速排序.归并排序,堆排序.在这个量级上,其他冒泡,选择,插入等简单排序已经无法胜任,效率极低,跟前面 ...
- 处理海量数据的高级排序之——快速排序(C++)
代码实现 ...
- 【高级排序算法】2、归并排序法的实现-Merge Sort
简单记录 - bobo老师的玩转算法系列–玩转算法 -高级排序算法 Merge Sort 归并排序 Java实现归并排序 SortTestHelper 排序测试辅助类 package algo; im ...
- 【高级排序算法】1、归并排序法 - Merge Sort
归并排序法 - Merge Sort 文章目录 归并排序法 - Merge Sort nlogn 比 n^2 快多少? 归并排序设计思想 时间.空间复杂度 归并排序图解 归并排序描述 归并排序小结 参 ...
- JAVA算法之高级排序
本章介绍两种高级排序,希尔排序和快速排序,这两种排序比之前讲到的简单排序都要快很多:希尔排序大约需要O(N*(logN)2)的时间,快速排序的时间复杂度为(N*logN),这两种算法和我们在讲递归的时 ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
随机推荐
- maven项目Tomcat controller 404
今天使用tomcat7.0.54启动现有的maven项目,可以正常启动,但是自己所写的所有的@controller注解的请求都报出了404的错误,在网上查了好久也很少找到这个问题,各种方法都尝试了也没 ...
- 程序员最喜爱的12个Android应用开发框架二(转)
在上一篇程序员最喜爱的12个Android应用开发框架(一)中,我们为大家介绍了前6个Android应用开发框架,主要包括了 Xamarin.Phonegap.Corona SDK等.接下来,小编将继 ...
- Lucene.net 全文检索 盘古分词
lucene.net + 盘古分词 引用: 1.Lucene.Net.dll 2.PanGu.Lucene.Analyzer.dll 3.PanGu.HighLight.dll 4.PanGu.dll ...
- HTML5_ScrollInToView方法
scrollIntoView(ture)元素上边框与视窗顶部齐平 scrollIntoView(false)元素下边框与视窗底部齐平 <html> <head> <tit ...
- this和super
1.this * 每个类的每个非静态方法(没有被static修饰)都会隐含一个this引用名称,它指向调用这个方法的对象. * 当在方法中使用本类的属性时,都会隐含地使用this名称,当然也可以明确指 ...
- android应用程序如何调用支付宝接口
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
- poj 1321 棋盘问题
八皇后问题变形,回溯法. #include <cstdio> #include <cstring> #include <iostream> using namesp ...
- express-20 REST API和JSON
简介 "Web服务"是一个通用术语,指任何可以通过HTTP访问的应用程序编程界面(API); 我们的重点是提供"REST风格"的服务,与其交互要更直接得多. R ...
- Swift3.0语言教程替换子字符串
Swift3.0语言教程替换子字符串 Swift3.0语言教程替换子字符串,替换子字符串其实就是将字符串中的子字符串删除,然后再进行添加.为了让这一繁琐的过程变的简单,NSString提供了替换子字符 ...
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...