算法通关村-----归并排序

基本原理

归并排序采用分治的思想,即分而治之,分就是将一个大问题分成一些小问题求解,治就是将分得的小问题得到的答案和在一起,得到最终的结果。体现在归并排序上,就是将大的数组分成小的序列,一直分到每个序列中只包含一个元素,此时序列内有序,然后两两合并,合并的方式即是合并两个有序数组,最终序列间有序,即整个数组有序,基本过程如下图所示

代码实现

java 复制代码
public void mergeSort(int[] array, int start, int end, int[] temp) {
	//2.直至每个序列只包含一个元素,停止划分
    if (start >= end) {
        return;
    }
    //1.从中间开始,每次划分为两个序列
    mergeSort(array, start, (start + end) / 2, temp);
    mergeSort(array, (start + end) / 2 + 1, end, temp);
    //3。进行有序数组的合并
    merge(array, start, end, temp);
}

public void merge(int[] array, int start, int end, int[] temp) {
	//找到序列中点
    int mid = (start + end) / 2;
    //left遍历左边的序列
    int left = start;
    //right遍历右边的序列
    int right = mid + 1;
    //index遍历临时数组,存储合并结果
    int index = 0;
    //两个序列均从起点到终点进行遍历
    while (left <= mid && right <= end) {
    	//将两个序列中较小的元素放入临时数组中
        if (array[left] < array[right]) {
            temp[index++] =array[left++];
        }else {
            temp[index++] =array[right++];
        }
    }
    //此时仅剩一个序列未遍历结束,直接赋值
    while (left <= mid){
        temp[index++] =array[left++];
    }
    while (right<=end){
        temp[index++] =array[right++];
    }
    //将归并的结果拷贝到原数组
    for (int i=start;i<=end;i++){
        array[i] = temp[i];
    }
}

例题分析

数组中的第K个最大元素

问题描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
详见leetcode215

问题分析

使用归并排序对数组进行从大到小的排序,排序后,返回数组下标为K-1的值,即为数组中第K大元素。

代码实现

java 复制代码
public int findKthLargest(int[] nums, int k) {
    int[] temp = new int[nums.length];
    mergeSort(nums,0,nums.length-1,temp);
    return nums[k-1];
}

public void mergeSort(int[] array, int start, int end, int[] temp) {
    //2.直至每个序列只包含一个元素,停止划分
    if (start >= end) {
        return;
    }
    //1.从中间开始,每次划分为两个序列
    mergeSort(array, start, (start + end) / 2, temp);
    mergeSort(array, (start + end) / 2 + 1, end, temp);
    //3。进行有序数组的合并
    merge(array, start, end, temp);
}

public void merge(int[] array, int start, int end, int[] temp) {
    //找到序列中点
    int mid = (start + end) / 2;
    //left遍历左边的序列
    int left = start;
    //right遍历右边的序列
    int right = mid + 1;
    //index遍历临时数组,存储合并结果
    int index = left;
    //两个序列均从起点到终点进行遍历
    while (left <= mid && right <= end) {
        //将两个序列中较小的元素放入临时数组中
        if (array[left] > array[right]) {
            temp[index++] =array[left++];
        }else {
            temp[index++] =array[right++];
        }
    }
    //此时仅剩一个序列未遍历结束,直接赋值
    while (left <= mid){
        temp[index++] =array[left++];
    }
    while (right<=end){
        temp[index++] =array[right++];
    }
    //将归并的结果拷贝到原数组
    for (int i=start;i<=end;i++){
        array[i] = temp[i];
    }
}
相关推荐
HZZD_HZZD16 分钟前
CSDN_批发市场水电漏损归因算法LAM的原理与落地
嵌入式硬件·物联网·算法
SL_staff32 分钟前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM1 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
SL_staff1 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl09251 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
shirsl2 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
码少女2 小时前
Linux--多路转接之select
java·服务器·数据库
木子算法3 小时前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪
虚无的纽扣3 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
多弗朗皮卡丘3 小时前
数据结构9:排序算法
c语言·数据结构·排序算法