Sort - Merge Sort
归并排序思想
归并排序时间复杂度分析
归并排序特点
归并排序实现
递归
#include <iostream>
using namespace std;
void merge(int *arr,int *temp,int left,int mid,int right) {
int p=left,q=mid+1,index=0;
while(p<=mid&&q<=right) {
if(arr[p]<arr[q])temp[index++]=arr[p++];
else temp[index++]=arr[q++];
}
while(p<=mid)temp[index++]=arr[p++];
while(q<=right)temp[index++]=arr[q++];
memcpy(arr+left, temp, sizeof(int)*(right-left+1));
}
void msort(int *arr,int *temp,int left, int right) {
if(left>=right)return;
int mid = left+((right-left)>>1);
msort(arr,temp,left,mid);
msort(arr,temp,mid+1,right);
merge(arr,temp,left,mid,right);
}
void merge_sort(int arr[],int len) {
int *temp=(int *)malloc(sizeof(int)*len);
if(temp!=NULL) {
msort(arr,temp,0,len-1);
free(temp);
}
}
int main(int argc,char *argv[]) {
int arr[]= {1,6,4,7,2,5,3,9,8,0};
merge_sort(arr,sizeof(arr)/sizeof(int));
for(int i=0;i<10;i++)printf("%d ",arr[i]);
return 0;
}
非递归
#include <iostream>
using namespace std;
void merge(int *arr,int *temp,int left,int mid,int right) {
int p=left,q=mid+1,index=left;
while(p<=mid&&q<=right) {
if(arr[p]<arr[q])temp[index++]=arr[p++];
else temp[index++]=arr[q++];
}
while(p<=mid)temp[index++]=arr[p++];
while(q<=right)temp[index++]=arr[q++];
}
void msort(int *arr,int *temp,int n,int len) {
int i;
for(i=0; i<=n-2*len; i+=2*len)
merge(arr,temp,i,i+len-1,i+2*len-1);
if(i+len<n) //剩余两段未排序
merge(arr,temp,i,i+len-1,n-1);
else { // 剩余一段未排序
for(int j=i; j<n; j++)
temp[j]=arr[j];
}
}
void merge_sort(int arr[],int n) {
int *temp=(int *)malloc(sizeof(int)*n);
int len =1;
if(temp!=NULL) {
while(len<n) {
msort(arr,temp,n,len); //将排序结果保存在temp数组中
len*=2;
msort(temp,arr,n,len); //将排序结果保存在arr数组中(如果len>n,只做了从temp到arr的元素拷贝)
len*=2;
}
free(temp);
}
}
int main(int argc,char *argv[]) {
int arr[]= {1,17,6,4,7,2,12,5,3,9,8,19,0,10,15,11,14,13,18,16};
merge_sort(arr,sizeof(arr)/sizeof(int));
for(int i=0; i<10; i++)printf("%d ",arr[i]);
return 0;
}
Sort - Merge Sort的更多相关文章
- [Algorithms] Sorting Algorithms (Insertion Sort, Bubble Sort, Merge Sort and Quicksort)
Recently I systematicall review some sorting algorithms, including insertion sort, bubble sort, merg ...
- 复杂度分析 quick sort&merge sort
空间复杂度看新开了什么数据结构就够了 公式=几个点*每个点执行了多少次 二叉树都是n次 二分法查找:lgn 全部查找:n n:找一个数,但是两边都要找.相当于遍历.类似于rotated sorted ...
- sicily 1154. Easy sort (tree sort& merge sort)
Description You know sorting is very important. And this easy problem is: Given you an array with N ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- 排序合并连接(sort merge join)的原理
排序合并连接(sort merge join)的原理 排序合并连接(sort merge join)的原理 排序合并连接(sort merge join) 访问次数:两张表都只会访 ...
- Sort merge join、Nested loops、Hash join(三种连接类型)
目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...
- 归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序 ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
随机推荐
- QThread创建多线程程序
最近在阅读Qt 5.9 C++开发指南,为了加深对书本上内容的理解,参照书上的讲解尝试写了一些demo,用于以后工作中查阅,如果涉及侵权请告知,实例程序samp13_1 mythread.h #ifn ...
- 每天一点点之vue框架开发 - 部署到线上
1.在项目根目录下运行如下命令 npm run build 会生成一个dist目录, 2.然后将dist目录上传至服务器就可以访问页面了,不需要配置vue环境了.
- 【LeetCode】克隆图
[问题]给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). 解释: 节点 的值是 ,它有两个邻居:节点 和 ...
- C++基础--虚函数和纯虚函数
虚函数的一种重要的应用是在子类重写父类方法上,一般都是在父类中声明的时候用关键字virtual修饰. 在C++中,一个父类的对象指针是可以指向子类的实例化对象,这个时候可以用该对象指针来访问父类的成员 ...
- css div框加小箭头
<div class="con"> <div class="arrow"> </div></div> .c ...
- Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
计算年.月.日需要安装组件包 pip install python-dateutil 当前日期时间 import datetime print datetime.datetime.now() # 20 ...
- 2019 年 Google 编程之夏活动报告
2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...
- (BUILDER)建造者与(FACTORY)工厂模式 的比较
首先,说明下 参考博文 1. 建造者 http://www.cnblogs.com/zhili/p/BuilderPattern.html 2. 抽象工厂 http://www ...
- OO第三单元“技术”博客
主要针对第三单元的三次作业 JML语言的理论基础.应用工具链情况 JML指的是Java建模语言,全称是Java modeling language,是一种行为接口规范语言,可用于指定Java模块的行为 ...
- [极客大挑战 2019]HardSQL
0x00 知识点 报错注入 链接: https://www.cnblogs.com/richardlee97/p/10617115.html 报错原因: 其原因主要是因为虚拟表的主键重复.按照MySQ ...