算法(第四版)学习笔记之java实现归并排序
来源:互联网 发布:淘宝网页模板免费下载 编辑:程序博客网 时间:2024/05/22 10:37
归并排序思想:将一个数组分成两部分分别排序(使用递归),然后将结果合并起来,即将最后两个有序的数组归并成一个更大的有序数组。
时间复杂度O(n) = NlogN
归并排序最吸引人的性质是它能保证将任意长度为N的数组排序所需时间和NlogN成正比,而缺点便是它所需的额外空间和N成正比。
归并排序又分为自顶向下的排序方式和自底向上的排序方式:
自顶向下的排序方式是利用了分治的思想,将一个大问题分割成若干个等价的子问题进行求解;
自底向上的排序方式是先归并那些微型数组,然后再成对归并得到的子数组。
两种排序方式的代码如下:
/** * * @author seabear * */public class MergeSort {private static Comparable[] b ;public static boolean less(Comparable v,Comparable w){return v.compareTo(w) < 0;}public static void merge(Comparable[] a,int lo,int mid,int hi){int i = lo;int j = mid + 1;for(int k = lo; k < hi + 1; k++){b[k] = a[k];}for(int k = lo; k < hi + 1; k++){if(i > mid){a[k] = b[j++];}else if (j > hi){a[k] = b[i++];}else if(less(b[i],b[j])){a[k] = b[i++];}else{a[k] = b[j++];}}}/** * 自顶向下和自底向上 * @param a */public static void sort(Comparable[] a){b = new Comparable[a.length];//自顶向下//sort(a,0,a.length-1);//自底向上for(int i = 1; i < a.length; i = i + i){for(int lo = 0; lo < a.length - i; lo += i + i){merge(a, lo, lo + i - 1, Math.min(lo + i + i - 1, a.length - 1));}}}public static void sort(Comparable[] a,int lo,int hi){if(hi <= lo){return ;}int mid = lo + (hi - lo) / 2;sort(a,lo,mid);sort(a,mid + 1,hi);merge(a,lo,mid,hi);}public static void show(Comparable[] a){for(int i = 0; i < a.length; i++){System.out.print(a[i] + " ");}System.out.println();}public static void main(String[] args){Integer[] a = new Integer[10];for(int i = 0; i < 10; i++){a[i] = (int)(Math.random() * 10 + 1);}show(a);sort(a);show(a);}}
0 0
- 算法(第四版)学习笔记之java实现归并排序
- 算法(第四版)学习笔记之归并排序的优化
- 算法(第四版)学习笔记之java实现选择排序
- 算法(第四版)学习笔记之java实现插入排序
- 算法(第四版)学习笔记之java实现希尔排序
- 算法(第四版)学习笔记之java实现快速排序
- 算法(第四版)学习笔记之java实现堆排序
- 算法学习之java实现归并排序
- [学习笔记]Java排序算法之归并排序
- Java实现排序算法之归并排序
- 排序算法之归并排序java实现
- 算法学习之路:分治策略-归并排序-java实现
- java实现排序算法之归并排序(2路归并)
- 算法 第四版 归并排序
- 归并排序算法之Java实现
- 【java实现】算法导论之归并排序
- Java算法实现之归并排序
- 排序算法之归并排序Java版
- 纯CSS绘制三角形(各种角度)
- C语言流程控制之循环笔记
- hiho一下 第五十五周 连通性·四(无向图点双连通分量)
- 有道小工具
- MFC第一个窗口,写,右键时间,左键坐标
- 算法(第四版)学习笔记之java实现归并排序
- 百度云消息推送机制在即时通信聊天界面的信息处理,技巧篇。
- ubuntu14.04+cuda7.0+opencv2.4.9
- gtk拖拽面板
- Xcode自定义alertview
- C6678中的PCIE相关总结(1)
- jsp 页面添加视频并显示播放时间
- 打开设备管理器的快捷方式
- 【Java】将构造函数声明为私有有什么作用?