网站首页 > 精选教程 正文
归并排序原理
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
- 自下而上的迭代;
归并排序算法步骤
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
- 重复步骤 3 直到某一指针达到序列尾;
- 将另一序列剩下的所有元素直接复制到合并序列尾。
动画演示
java代码实现
import java.util.Arrays;
public class MergeSort {
public static int[] aux;
public static void mergeArr(int[] arr, int low
, int mid, int high){
for(int i = low; i <= high; i++){
aux[i] = arr[i];
}
int i = low;
int j = mid + 1;
for(int k = low; k <= high; k++){
if(i > mid){
arr[k] = aux[j++];
}
else if(j > high){
arr[k] = aux[i++];
}
else if(aux[i] < aux[j]){
arr[k] = aux[i++];
}
else{
arr[k] = aux[j++];
}
}
}
public static void sort(int[] arr){
aux = new int[arr.length];
sort(arr, 0, arr.length-1);
}
public static void sort(int[] arr, int low, int high){
int mid = low + (high-low)/2;
if(low >= high){
return;
}
sort(arr,low,mid);
sort(arr,mid+1,high);
mergeArr(arr, low, mid, high);
}
public static void main(String[] args) {
int[] arr = {1,56,23,15,5,45,38,26,11,5,35,8};
System.out.println("排序前:"+Arrays.toString(arr));
sort(arr);
System.out.println("排序后:"+Arrays.toString(arr));
}
}
归并排序效率
归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。
- 上一篇: ???数组中的逆序对(归并排序思想)
- 下一篇: Java二维数组绝妙练习题—杨辉三角
猜你喜欢
- 2024-11-28 JAVA数据结构和算法-简单排序之选择排序
- 2024-11-28 面试官问我Arrays.sort()为什么可以对int等数组进行排序
- 2024-11-28 Java几种排序方式
- 2024-11-28 动力节点教学:多维数组用法
- 2024-11-28 「剑指offer题解」二维数组中的查找
- 2024-11-28 2021-09-26:搜索旋转排序数组。整数数组 nums 按升序排列,数组中
- 2024-11-28 java 数组动态接收和冒泡排序
- 2024-11-28 嵌入式C语言基础编程——5年程序员给你讲解字符数组,精品干货
- 2024-11-28 开发人员是如何使用Java进行排序?
- 2024-11-28 100个Java工具类之13:实现数组和集合排序的多种方法
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)