博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序——归并排序
阅读量:4557 次
发布时间:2019-06-08

本文共 2471 字,大约阅读时间需要 8 分钟。

 归并排序的实质就是将数据先划分为小组,在两个相邻小组内部排序之后,再扩大小组进行排序

注意:

  1、在两个小组内部排序的时候,需要用到一个辅助数组,来将两个小组中的数据进行排序,排完序之后,将辅助数组中的数据拷贝回原数组中的适当位置即可

  2、再求mid时,有一个简单的防止溢出,快捷的方法,mid = left + ((right - left) >> 1); 但是要注意到+的优先级高于 >>,所以在进行位计算时,要加上括号

 时间复杂度 O(NlogN)  空间复杂度O(N)

public void mergeSort(Integer[] arrays){        if(arrays.length == 0) return;        mergeSort(arrays, 0, arrays.length - 1);    }    public void mergeSort(Integer[] arrays, int left, int right){        if(left >= right) return;        int mid = ((right - left) >> 1) + left;        mergeSort(arrays, left, mid);        mergeSort(arrays, mid + 1, right);         Integer [] help = new Integer[right - left + 1];        int i = 0;        int x = left, y = mid + 1;        while(x <= mid &&y <= right){            help[i++] = arrays[x] < arrays[y] ? arrays[x++] : arrays[y++];        }        while(x <= mid){            help[i++] = arrays[x++];        }        while(y <= right){            help[i++] = arrays[y++];        }        i = 0;        while(i < help.length){            arrays[left + i] = help[i++];        }    }

  

更加直观的写法(推荐)因 为这样有一个方法用来进行分组,另外一个方法 进行融合, 更加直观

package sort;import static sort.PrintRes.print;/** * Created by Skye on 2018/4/2. */public class MergeSort {    public void mergeSort(Integer[] arrays){        if(arrays.length == 0) return;        mergeSortEasy(arrays, 0, arrays.length - 1);    }    public void mergeSortEasy(Integer[] arrays, int left, int right){        if(left >= right) return;        int mid = left + ((right - left) >> 1);        mergeSortEasy(arrays, left, mid);        mergeSortEasy(arrays, mid + 1, right);        merge(arrays, left, mid, right);    }    public void merge(Integer[] arrays, int left, int mid, int right){        int i = 0;        int [] help = new int[right - left + 1];        int x = left;        int y = mid + 1;        while(x <= mid && y <= right){            help[i++] = arrays[x] < arrays[y] ? arrays[x++] : arrays[y++];        }        while(x <= mid){            help[i++] = arrays[x++];        }        while(y <= right){            help[i++] = arrays[y++];        }        i = 0;        while(i < help.length){            arrays[left + i] = help[i++];        }    }}

  

 

相关问题:

小和问题

在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和。 求一个数组的小和。
例子:
[1,3,4,2,5]
1左边比1小的数, 没有;
3左边比3小的数, 1;
4左边比4小的数, 1、 3;
2左边比2小的数, 1;
5左边比5小的数, 1、 3、 4、 2;
所以小和为1+1+3+1+1+3+4+2=16

逆序对问题

在一个数组中, 左边的数如果比右边的数大, 则折两个数构成一个逆序对, 请打印所有逆序对

转载于:https://www.cnblogs.com/SkyeAngel/p/8666572.html

你可能感兴趣的文章
(1.1)学习笔记之mysql体系结构(内存、进程、线程)
查看>>
markdown测试
查看>>
Java-Maven-Runoob:Maven 依赖管理
查看>>
杂项-Log:log4net
查看>>
杂项-Java:EL表达式
查看>>
tarroni music
查看>>
unity 使用RotateAround的使用注意
查看>>
[SDOI2009]HH的项链
查看>>
CodeFirst模式,容易引发数据迁移问题(不建议使用)
查看>>
jquery的colorbox关闭并传递数据到父窗
查看>>
使用Nginx、Keepalived构建文艺负载均衡
查看>>
phpmyadmin 开放远程登录的权限
查看>>
linux安装gcc和gcc-c++
查看>>
qq登陆错误提示
查看>>
bzoj 1192: [HNOI2006]鬼谷子的钱袋 思维 + 二进制
查看>>
没写完,没调完,咕咕咕的代码
查看>>
Android Studio使用技巧:导出jar包
查看>>
Problem E. TeaTree - HDU - 6430 (树的启发式合并)
查看>>
Kafka序列化和反序列化与示例
查看>>
【Windows 8 Store App】学习一:获取设备信息
查看>>