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 ...
随机推荐
- 032-session函数
<?php $username="guest1"; if(isset($username)) { session_name($username); } echo " ...
- ServletConfig详解
ServletConfig是Servlet中的init()方法的参数类型,服务器会在调用init()方法时传递ServletConfig对象给init()方法. ServletConfig对象封装 ...
- bash 内嵌命令 printf 用于进制转换
printf - 格式化并显示数据 printf "%d" 0x10 printf "%x" 16
- 由于找不到msvcp100.dll无法继续执行代码
最近重装系统之后安装mysql, 执行 mysqld install 命令时出现 : 由于找不到msvcp100.dll无法继续执行代码... 解决办法 下载 Microsoft Visual C++ ...
- GRADLE依赖的统一管理
参考链接:http://stormzhang.com/android/2016/03/13/gradle-config/ 我想大部分人应该都在使用Gradle来依赖管理,还没有使用的去面壁思过,Gra ...
- python:批量修改文件名批量修改图片尺寸
批量修改文件名 参考博客:https://www.cnblogs.com/zf-blog/p/7880126.html 功能:批量修改文件名 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- POST和GET方法乱码解决方案
前言 在WEB开发的过程中,中文乱码是最为常见的问题之一.之所以会出现中文乱码的情况,主要原因是:前端使用POST或者GET方法传递的参数一般使用浏览器预先设置的编码方式进行编码,中文浏览器一般是使用 ...
- pytorch 自动求梯度
自动求梯度 在深度学习中,我们经常需要对函数求梯度(gradient).PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播.本节将介绍如何使用autogra ...
- Delphi生成即调用带窗体的Dll
library frmDll; { Important note about DLL memory management: ShareMem must be the first unit in you ...
- Java 容器使用中如何选择
Collection ├List │├LinkedList │├ArrayList │└Vector │└Stack ├Queue │├Deque │└LinkedList └Set ├Sort ...