排序算法-归并排序_归并排序
来源:互联网 发布:京东java面试经验 编辑:程序博客网 时间:2024/06/06 08:24
package 归并排序;/** * 归并排序【稳定】 * * 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。 * 然后再把有序子序列合并为整体有序序列。 */public class 归并排序 { public static void main(String[] args) { int[] a = { 49, 38, 65, 97, 76, 13, 27 }; System.out.println("排序之前:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } mergeSort(a, 0, a.length - 1);// 归并排序 System.out.println(); System.out.println("排序之后:"); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } private static void mergeSort(int[] a, int left, int right) { if (left < right) { int middle = (left + right) / 2; // 对左边进行递归 mergeSort(a, left, middle); // 对右边进行递归 mergeSort(a, middle + 1, right); // 合并 merge(a, left, middle, right); } } private static void merge(int[] a, int left, int middle, int right) { int[] tmpArr = new int[a.length]; int mid = middle + 1; // 右边的起始位置 int tmp = left; int third = left; while (left <= middle && mid <= right) { // 从两个数组中选取较小的数放入中间数组 if (a[left] <= a[mid]) { tmpArr[third++] = a[left++]; } else { tmpArr[third++] = a[mid++]; } } // 将剩余的部分放入中间数组 while (left <= middle) { tmpArr[third++] = a[left++]; } while (mid <= right) { tmpArr[third++] = a[mid++]; } // 将中间数组复制回原数组 while (tmp <= right) { a[tmp] = tmpArr[tmp++]; } }}
运行结果如下:
排序之前:49 38 65 97 76 13 27 排序之后:13 27 38 49 65 76 97
1 0
- 排序算法-归并排序_归并排序
- 排序算法_归并排序
- 排序算法_插入排序、归并算法
- 算法导论_归并排序
- JAVA_算法_归并排序
- 数据结构(C#)_排序算法(归并排序)
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- PHP衣食父母系列-依赖倒置
- mouseover/mouseout和mouseenter/mouseleave的区别
- OOLua的接口绑定
- TextView中英文排版混乱
- Android内核学习笔记
- 排序算法-归并排序_归并排序
- 差点就坚持不下去了
- Swift(十七、可选链)
- Android应用中平滑的手写效果实现
- Plist 数据库的使用方法
- 新浪微博SDK抛出异常-[__NSDictionaryM weibosdk_WBSDKJSONString]: unrecognized selector sent to instance 0x7fb
- NYOJ 202 红黑树 【二叉树 中序遍历】
- leetcode:Binary Tree Maximum Path Sum
- android-Ultra-Pull-To-Refresh源码分析