网站首页 > java教程 正文
简介:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二路归并排序是一种稳定的算法。

两个有序的数组合并的思路:
假设有两个已经排好序的数组arr1[ ],arr2[ ],且均是升序或者降序,那么可以进行以下操作:以升序为例,先创建一个尺寸大小为arr1[ ]与arr2[ ]尺寸之和的数组temp[ ],然后同时从两数组的第0个元素开始遍历,若arr1[i] < arr2[j],则可以把arr1[i]放入temp[k]中后,执行i++,k++,继续往后比较;若arr1[i] > arr2[j],则可以把arr2[j]放入temp[k]中后,执行j++,k++,继续往后比较;最终直到把两个数组中的所有元素放入数组temp[ ]中。
上图说话
现比如有集合:{3, 1, 10, 2, 5, 4, 11, 33, 5}
分而治之:
首先先将元素分成大概数量相等的2个子集合,下面就是“分”的过程:
看上面的,可以深度为log2(n) = 4。
当分到最后只能一个元素时,则将两两子集合合并成一个集合,下面就是“治”的过程:
以下面这两个子集合作为例子,作为“治”的例子。
a[0] <= b[0],则将a[0]移到数组:
a的索引变为1。
a[1] > b[0],则将b[0]移到数组:
b的索引变为1。
a[1] <= b[1],则将a[1]移到数组:
a的索引变为2。
a[2] > b[1],则将b[1]移到数组:
b的索引变为2。
int[] b已经循环完了,则将int[] a的元素移到数组:
最后治到最后结果为:[1,2,3,5,10]
通过循环的“治”过程,最后得到排序的结果:[1,2,3,4,5,5,10,11,33]
Java代码
因为屏幕原因截图截不全,下面是上面方法参数说明
以下代码方便复制粘贴
public class MergeSort {
public static void main(String[] args) {
int[] array = new int[]{0,53,63,38,71,25,22,11,95,38};
sort(array,0,array.length-1);
System.out.println(Arrays.toString(array));
}
private static void sort(int[] array, int start, int end) {
//跳出递归的条件
if (start >= end) { return; }
int mid = (start + end) / 2;
// 递归实现归并排序
sort(array, start, mid);
sort(array, mid + 1, end);
mergerSort(array, start, mid, end);
}
/**
* 将两个有序序列归并为一个有序序列(二路归并)
* @param array
* @param start 开始数组开始的位置
* @param mid 中间位置(因为合的必定是相挨的数组)
* @param end 结束的位置
*/
private static void mergerSort(int[] array, int start, int mid, int end) {
// 定义一个临时数组,用来存储排序后的结果
int[] arr = new int[end - start + 1];
//零时数组的下标
int low = 0;
//记录开始的位置,方便后面替换用
int left = start;
int center = mid + 1;
// 取出最小值放入临时数组中
while (start <= mid && center <= end) {
//如果第一个数组的数大于第二个数组,则取第二哥数组中的数据
arr[low++] = array[start] > array[center] ? array[center++] : array[start++];
}
// 若还有段序列不为空,则将其加入临时数组末尾
while (start <= mid) {
arr[low++] = array[start++];
}
while (center <= end) {
arr[low++] = array[center++];
}
// 将临时数组中的值copy到原数组中
for (int i = left , j = 0; i <= end && j < arr.length; i++,j++) {
array[i] = arr[j];
}
}
}
猜你喜欢
- 2024-10-22 Java几种排序方式(java排序的方法有哪些)
- 2024-10-22 Java 集合中的排序算法浅析(java集合排序工具类)
- 2024-10-22 数组排序与二分查找法(二分查找排序树)
- 2024-10-22 LeetCode基础算法题第85篇:求有序数组的平方再排序
- 2024-10-22 Java中Arrays的两种排序方法(sort和parallelSort)比较
- 2024-10-22 深入理解Java中Comparable和Comparator排序
- 2024-10-22 Java常见知识之冒泡排序#冒泡排序
- 2024-10-22 Java数组之Arrays方法(java array数组)
- 2024-10-22 常用集合的排序方法——Java进阶知识讲义系列(七)
- 2024-10-22 Java数组(java数组初始化)
欢迎 你 发表评论:
- 11-22怎么在微软官网下载win7系统
- 11-22win10亮度调节消失了(win10亮度调节不见了怎么办)
- 11-22回车键发送消息在哪里设置(oppo手机回车键怎么设置)
- 11-22u盘鉴定器(U盘鉴定器)
- 11-22电脑笔记本开不了机怎么办(电脑笔记本开不了机怎么办按哪个键)
- 11-22电脑重设开机密码步骤(电脑重设开机密码怎么弄)
- 11-22显卡跑分天梯图(笔记本显卡排行天梯图)
- 11-22安卓支持flash浏览器(安卓能用的flash)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)

本文暂时没有评论,来添加一个吧(●'◡'●)