归并排序算法(Java实现)

1.归并排序算法思想

也称合并排序算法 ,是将两个或两个以上的有序数据序列合并成一个新的有序数据序列。该算法采用分治法(Divide and Conquer)的思想,将待排序的序列分成若干个子序列,分别对子序列进行排序,然后将有序的子序列合并成一个大的有序序列

注:将几个有序队列合并成一个新的有序数据队列就称为几路归并排序算法

2.归并排序算法实现步骤

归并排序的基本步骤如下:
(1)分解

将待排序的序列分成若干个子序列,每个子序列都是有序的。这是通过递归实现的,每次递归都将原序列分成两个子序列
(2)解决

对每个子序列进行排序。这是通过递归调用的方式实现的,递归调用归并排序函数对子序列进行排序。
(3)归并

将已排序的子序列归并成一个大的有序序列。这是通过归并操作实现的,将两个有序的子序列归并成一个新的有序序列。在归并的过程中,采用归并算法(Merge Algorithm)将两个有序的子序列归并成一个新的有序序列。具体操作如下:

1)初始化两个指针i和j,分别指向两个子序列的起始位置。

2)比较两个指针所指向的元素,将较小的元素复制到一个临时数组中,然后将指针加1,继续比较下一个元素。

3)当一个指针到达子序列的末尾时,将另一个子序列剩余的元素复制到临时数组中。

4)将临时数组中的元素复制回原数组,完成合并操作。
通过递归调用和合并操作,最终得到一个有序的序列

3.归并排序算法性能分析

性能 性能指标
最坏时间复杂度 O ( n log ⁡ 2 n ) O(n\log_{2^n}) O(nlog2n)
最好时间复杂度 O ( n log ⁡ 2 n ) O(n\log_{2^n}) O(nlog2n)
平均时间复杂度 O ( n log ⁡ 2 n ) O(n\log_{2^n}) O(nlog2n)
空间复杂度 O(n)
稳定性 稳定

4.归并排序算法代码实现(Java实现)

java 复制代码
public class Demo {
    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9,10};
        mergeSort(arr,0,arr.length-1);
        for(int i:arr){
            System.out.println(i);
        }
    }
    //归并排序的归并操作
    public static void merge(int[] arr,int low,int mid ,int high){
        int i,j,k;
        int[] tempArr = new int[arr.length];//辅助数据
        for(k = low; k <=high; k++){ //将原数组复制到辅助数组中
            tempArr[k] = arr[k];
        }
        //arr[low...mid]和arr[mid+1...high]各自有序,将两个部分归并
        for(i=low, j=mid+1, k=i; i<=mid && j <= high; k++){
            if(tempArr[i] > tempArr[j]){ //">"号代表升序,"<"号代表降序
                arr[k] = tempArr[i++];
            }else{
                arr[k] = tempArr[j++];
            }
        }
        while(i <= mid){ //将左半部分的剩余元素依次放入到新数组中
            arr[k] = tempArr[i++];
            k++;
        }
        while( j <= high){ //将右半部分的剩余元素依次放入到新数组中
            arr[k] = tempArr[j++];
            k++;
        }
    }
    //归并排序的递归部分
    public static void mergeSort(int[] arr,int low,int high){
       if(low < high){ // 递归结束条件
           int mid = (low + high)/2;
           mergeSort(arr,low,mid); //对数组左半部分归并排序
           mergeSort(arr,mid+1,high); //对数组右半部分归并排序
           merge(arr,low,mid,high); //归并
       }
    }
}
相关推荐
生戎马2 分钟前
Tomcat Container容器之Engine:StandardEngine _
java·tomcat
学逆向的8 分钟前
汇编——位运算
开发语言·汇编·算法·网络安全
zhangjw3416 分钟前
第29篇:Java伪共享与对象分配:并发性能优化的关键
java·开发语言·性能优化
可编程芯片开发23 分钟前
基于simulink的PEM燃料电池控制系统建模与仿真,对比PID,积分分离以及滑模控制器
算法
宠友信息36 分钟前
内容社区源码多端数据协议与 Spring Boot 状态流转实现思路
java·spring boot·websocket·uni-app
学究天人39 分钟前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷2)
算法·数学建模·动态规划·图论·抽象代数·拓扑学
Java面试题总结1 小时前
Python 开发技巧 · 高级装饰器 —— 从基础到工业级实战
开发语言·python
一路向北North1 小时前
Spring Security OAuth2.0(19):JWT令牌
java·后端·spring
玛卡巴卡ldf1 小时前
【LeetCode 手撕算法】(细节知识点总结)
java·数据结构·算法·leetcode·力扣
wanzehongsheng2 小时前
零碳产业园光伏园区光伏电站追踪对比固定:发电增益技术边界分析
算法·光伏发电·光伏·零碳园区·太阳能追光·低碳环保·追踪电站