第一次归并:

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:原地归并排序的更多相关文章

  1. STL:原地归并排序模板(InplaceMergeSort)

    原理:就是在归并排序上改进,以时间复杂度换空间复杂度,利用元素反转完成排序 具体过程如下: 具体操作看代码吧,应该没什么难度,主要是reverse要反转三次 typedef int Position; ...

  2. 【Algorithms】归并排序(merge sort)

    几个比较常见的排序算法里头,这个我是比较生疏的一个,有一天突然被问了一个问题是,归并排序最大的特点是什么,我才想起这个算法来.下午又看不进书啦,就实现一下,记下来. 归并排序采取的是分治策略,就是先将 ...

  3. Coursera Algorithms week3 归并排序 练习测验: Shuffling a linked list

    题目原文: Shuffling a linked list. Given a singly-linked list containing n items, rearrange the items un ...

  4. 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 ...

  5. 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 ...

  6. java归并排序,单线程vs多线程

    一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...

  7. 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort

    起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...

  8. 总结: Sort 排序算法

    排序总结 面试经验 硅谷某前沿小Startup面试时,问到的一个题目就是写一个快速排序算法.进而面试官问到了各种算法的算法复杂度,进而又问了Merge Sort 与 QuickSort 的优劣. 对排 ...

  9. 033.[转] Java 工程师成神之路 | 2019正式版

    Java 工程师成神之路 | 2019正式版 原创: Hollis Hollis 2月18日 https://mp.weixin.qq.com/s/hlAn6NPR1w-MAwqghX1FPg htt ...

随机推荐

  1. 【转】 linux 安装nginx及编译参数详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. 从官网下载一个nginx 的tar.gz 版. 安装方式使用make 安装 第一步:解压 tar -zxvf  nginx-1.7.4.tar.g ...

  2. [转]ps/2键盘线序识别方法

    from: http://www.360doc.com/content/11/0816/19/844619_140875056.shtml 经常看到有人询问ps/2线坏了,更换的时候如何测线序连线,或 ...

  3. S5PV210之beep-bus模型 linux3.0.8驱动

    目录: 一. bus-driver-device模型 二. 运行结果,及错误解决 三. 怎样利用以有的driver device驱动来写自已的beep-driver-device 驱动       四 ...

  4. JVM-垃圾收集器

    Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集器可能会有很大差距.  HotSpot虚拟机示意图: 说明:两个收集器之间存在连线说明它们可 ...

  5. poj1837 dp

    //Accepted 2176 KB 47 ms //杠杆平横的条件:sum(c[i]*sum(g[j]))=0 // 所有的hook到原点的距离乘它上面挂着的物体的重量和的和为0 //对于一个hoo ...

  6. 检测INT3 软断点

    “INT3”断点指令的机器码是 “0xcch” 检测思路,取函数地址,判断第一个字节是不是 “CCh” BYTE bFirst = ; ProcAddres = GetProcAddress(Load ...

  7. redis简介以及与memcached比较

    一.redis (1)简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.是noSql数据库的一种. re ...

  8. (spring-第11回【IoC基础篇】)BeanWrapper--实例化Bean的第四大利器

    重复是理解和记忆的最好方法.在讲实例化Bean的每个步骤之前,我都会先复习一下Bean实例化的整个过程: 结合图片我们回顾一下具体的过程: ResourceLoader加载配置信息, 由BeanDef ...

  9. IOS创建目录接口createDirectoryAtPath:withIntermediateDirectories:中参数attributes的设置

    在应用程序执行时,经常需要本地化保存一些重要的数据,这时就有可能需要创建一些目录.Objective-C提供了一个非常强大的创建目录的接口: - (BOOL)createDirectoryAtPath ...

  10. 基础框架Fundation和UIkit框架的定义和使用

    Foundation 框架为所有应用程序提供基本的系统服务 您的应用程序以及 UIKit 和其他框架,都建立在 Foundation 框架的基础结构之上.Foundation 框架提供许多基本的对象类 ...