【原创】Algorithms:原地归并排序
第一次归并:
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
23 |
8 |
19 |
33 |
15 |
6 |
27 |
↑ ↑
i j
最开始i指向a[0],j指向a[1],比较a[0],a[1]大小,并进行swap
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
23 |
19 |
33 |
6 |
15 |
27 |
↑ ↑
i j
i指向j时候归并结束
第二次归并:
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
23 |
19 |
33 |
6 |
15 |
27 |
↑ ↑
i j
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
23 |
19 |
33 |
6 |
15 |
27 |
↑ ↑
i j
i向后移动,直到找到比j指向的数大的那个数,此时,i之前的数是两段数值中最小的数
j原来的位置标记为Index,j向后移动找到比此时i指向的数大的数.
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
33 |
6 |
15 |
27 |
↑ ↑ ↑
i index j
则此时a[Index,j]之间的数小于a[i,index]之间的数,将此两段数值互换,得到
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
23 |
33 |
6 |
15 |
27 |
↑ ↑
i j
互换以后需要调整i的位置,将i向后移动index-j个单位【i+=(j-index)】
找到第一个比j指向的数大的,即此时i指向j,第二次归并结束。
第三次归并:
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
19 |
23 |
33 |
6 |
15 |
27 |
↑ ↑
i j
重复上述步骤,在此归并中,第一次比较时i不动,j指向a[5]
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
8 |
19 |
23 |
33 |
6 |
15 |
27 |
↑ ↑ ↑
i index j
交换a[index,j]和a[i,index]两段数据,i+=(j-index)
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
19 |
23 |
33 |
15 |
27 |
↑ ↑ i j
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
19 |
23 |
33 |
15 |
27 |
↑ ↑
i j
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
19 |
23 |
27 |
↑ ↑ ↑
i index j
swap(i,j,index)
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
19 |
23 |
33 |
27 |
↑ ↑
i j
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
15 |
19 |
23 |
33 |
27 |
↑ ↑
i j
此时j任然指向a[6],index也指向a[6],交换
|
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
|
6 |
8 |
15 |
19 |
23 |
27 |
33 |
↑ ↑
i j
i之后第一个比j指向的数大的数为33,此时i=j,归并结束
代码还没写完。。。。。脑子笨,感觉不大对,再改看看吧。pow这个函数总觉得用的不大对,这两天看看别人写的代码再找找思路看。
void in_palce_merge_sort(double* a,int n){
int index;
int edge=;
int i=;//第一段有序数组入口
int j=;//第二段有序数组入口
int inpoint=;
while(pow(,edge)<n){
while(a[i]<a[j]&&i<j) i++;
index=j;
while(a[j]<a[i]&&j<inpoint+pow(,edge)) j++;
swap(a[i],a[j],a[index]);
i+=(j-index);
if(i==j&&i<n){
i++; //此时往后移一位即新的有序数组的入口
j=i+pow(,edge); //等下考虑下2倍
inpoint=j;
}
else if(i==n){
edge++;
i=;
j=pow(,edge);
inpoint=j;
}
}
}
关于swap(),个人想到的是需要一段临时空间作为暂存空间进行交换,如果这样的话感觉就失去原地归并的意义了,其他搜索到有手摇算法,等仔细研究下再来修改。
【原创】Algorithms:原地归并排序的更多相关文章
- STL:原地归并排序模板(InplaceMergeSort)
原理:就是在归并排序上改进,以时间复杂度换空间复杂度,利用元素反转完成排序 具体过程如下: 具体操作看代码吧,应该没什么难度,主要是reverse要反转三次 typedef int Position; ...
- 【Algorithms】归并排序(merge sort)
几个比较常见的排序算法里头,这个我是比较生疏的一个,有一天突然被问了一个问题是,归并排序最大的特点是什么,我才想起这个算法来.下午又看不进书啦,就实现一下,记下来. 归并排序采取的是分治策略,就是先将 ...
- Coursera Algorithms week3 归并排序 练习测验: Shuffling a linked list
题目原文: Shuffling a linked list. Given a singly-linked list containing n items, rearrange the items un ...
- Coursera Algorithms week3 归并排序 练习测验: Counting inversions
题目原文: An inversion in an array a[] is a pair of entries a[i] and a[j] such that i<j but a[i]>a ...
- Coursera Algorithms week3 归并排序 练习测验: Merging with smaller auxiliary array
题目原文: Suppose that the subarray a[0] to a[n-1] is sorted and the subarray a[n] to a[2*n-1] is sorted ...
- java归并排序,单线程vs多线程
一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort
起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...
- 总结: Sort 排序算法
排序总结 面试经验 硅谷某前沿小Startup面试时,问到的一个题目就是写一个快速排序算法.进而面试官问到了各种算法的算法复杂度,进而又问了Merge Sort 与 QuickSort 的优劣. 对排 ...
- 033.[转] Java 工程师成神之路 | 2019正式版
Java 工程师成神之路 | 2019正式版 原创: Hollis Hollis 2月18日 https://mp.weixin.qq.com/s/hlAn6NPR1w-MAwqghX1FPg htt ...
随机推荐
- SharePoint 2013 企业搜索架构示例
博客地址:http://blog.csdn.net/FoxDave 本文参考自微软官方的Chart,我们来看一下企业中对于不同规模SharePoint搜索的场的架构是什么样的. 对于搜索场的规模, ...
- hadoop2.x通过Zookeeper来实现namenode的HA方案以及ResourceManager单点故障的解决方案
我们知道hadoop1.x之前的namenode存在两个主要的问题:1.namenode内存瓶颈的问题,2.namenode的单点故障的问题.针对这两个问题,hadoop2.x都对它进行改进和解决.其 ...
- pod创建的工程找不到库
ld: library not found for -lAFNetworking app工程 和 Pod工程里面的所有库 Build Active Architecuture Only 所有库都设 ...
- vega prime 1.2 (视景仿真)
Vega Prime 1.2 (视景仿真) MPI的视景仿真渲染工具Vega是世界上领先的应用于实时视景仿真.声音仿真和虚拟现实等领域的软件环境,它用来渲染战场仿真.娱乐.城市仿真.训练模拟器和计算可 ...
- 树莓派安装kali后的简单配置
树莓派可以说是极客的最爱,可以根据不同的需求去做定制. 前文<使用树莓派和kali Linux打造便携式渗透套件>讲了一些使用树莓派的基础,主要侧重于将树莓派当作一个物理后门使用.我则更喜 ...
- PHP中使用mysql处理结果集
一.从结果集中将记录取出 mysql_fetch_row($result); 从结果集中取得一行作为枚举数组 mysql_fetch_row($result mysql_fetch_assoc( ...
- Android Studio And Gradle
AS特色: 智能感知体验特好,堪比VS 布局预览,手写布局后预览页面即时显示,便于布局调整和优化 编辑速度飞快流畅,毫无eclipse的卡顿 布局或源码中有图标和颜色的预览,十分直观 调试时体验极佳 ...
- codeforces #Round354-div2-D(BFS)
题目链接:题目链接 题意:一个n*m的区域,每个格子都有上下左右四个门,相邻的两个格子A可以通向B当且仅当A对B的门和B对A的门都打开,问从起点S到终点T需要的最短时间 #include<bit ...
- Codechef2015 May - Chef and Strings (后缀自动机)
用后缀自动机统计出出现1~n次的串的数量f[i] 对于ans[k]=sigma(f[i]*C(i,k)) i>=k ; mo=; ..maxn] of dword; nt:..maxn,'a'. ...
- SQL基础,与数据类型;
net start mssqlserver 开启数据库: net stop mssqlserver 关闭数据库: net pause mssqlserver 暂停数据库: net continu ...