归并排序算法(经典、常见)

今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,归并排序

基本概念:

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

分治法:

基本思想:
将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
精髓:
分------将问题分解为规模更小的子问题。
治------将这些规模更小的子问题逐个击破。
合------将已解决的子问题合并,最终得到原问题的解。

动图演示:

代码实现:

复制代码
import java.util.Arrays;
 
//归并排序:先分再合
public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {3,1,4,6,22,0,33,2,745,5,56,8};
        int[] temp = new int[arr.length];
        System.out.println("未排序数组:"+ Arrays.toString(arr));
        mergeSort(arr,0,arr.length-1,temp);
        System.out.println("已排序数组:"+ Arrays.toString(arr));
    }
 
    //mergeSort()方法:将数组分组出来
    public static void mergeSort(int[] arr,int left,
                                    int right,int[] temp){
        //将数组进行分组
        if (left < right){
            int l = left;
            int r = right;
            int middle = (l+r)/2;

            //将分组进行排序整合
            merge(arr,left,middle,right,temp);//将左边的部分继续分
            mergeSort(arr,0,middle,temp);//将右边的部分继续分
            mergeSort(arr,middle+1,r,temp);
        }
    }
 
    public static void merge(int[] arr,int left,int middle,int right,int[] temp){
        int l = left;
        int r = middle+1;
        int t = 0;
       
         //用于临时数组下标索引
        while(l <= middle && r <= right){
        //先将两个部分整合
            temp[t++] = arr[l] <= arr[r]?arr[l++] : arr[r++];
        }
        //如果左边的部分还有元素没有被合并,则接着l继续合并
        while(l <= middle){
            temp[t++] = arr[l++];
        }
        //如果右边的部分还有元素没有被合并,则接着r继续合并
        while (r <= right){
            temp[t++] = arr[r++];
        }
        //将temp临时数组中的元素顺序传到arr数组中
        t = 0;
        int tempLeft = left;
        while(tempLeft <= right){
            arr[tempLeft] = temp[t];
            tempLeft++;
            t++;
        }
    }
}

代码分析:

基本思路:

步骤:1.将序列中待排序数字分为若干组,每个数字分为一组

2.将若干个组两两合并,保证合并后的组是有序的

3.重复第二步操作直到只剩下一组,排序完成

基本思路:

归并排序,先将数组进行拆分,每次拆成两份,然后继续拆分直到一组有两个元素为止,然后再进行两两整合排序,重复两两整合排序直至数组元素排序完成。

平均时间复杂度:O(nlogn)

注意:

复制代码
 temp[t++] = arr[l] <= arr[r]?arr[l++] : arr[r++];
即  
       if (arr[l] <= arr[r]){
                temp[t] = arr[l];
               t++;l++;
           }else{
               temp[t] = arr[r];
               t++;r++;
            }


  temp[t++] = arr[l++];
即
           temp[t] = arr[l];
           t++;l++;



 temp[t++] = arr[r++];
即

            temp[t] = arr[r];
            t++;r++;
相关推荐
liu****2 分钟前
能源之星案例
人工智能·python·算法·机器学习·能源
2501_9011478313 分钟前
环形房屋打家劫舍算法
考研·算法·leetcode·高考
智驱力人工智能21 分钟前
守护矿山动脉 矿山皮带跑偏AI识别系统的工程化实践与价值 皮带偏离检测 皮带状态异常检测 多模态皮带偏离监测系统
大数据·人工智能·opencv·算法·安全·yolo·边缘计算
智驱力人工智能30 分钟前
构筑安全红线 发电站旋转设备停机合规监测的视觉分析技术与应用 旋转设备停机检测 旋转设备异常检测 设备停机AI行为建模
人工智能·opencv·算法·安全·目标检测·计算机视觉·边缘计算
宵时待雨37 分钟前
数据结构(初阶)笔记归纳2:顺序表的实现
c语言·数据结构·笔记·算法
寻星探路37 分钟前
【算法进阶】滑动窗口与前缀和:从“和为 K”到“最小覆盖子串”的极限挑战
java·开发语言·c++·人工智能·python·算法·ai
不穿格子的程序员41 分钟前
从零开始刷算法——二叉树篇:层序遍历 + 有序数组转二叉搜索树
算法
kaikaile199544 分钟前
同伦算法求解非线性方程组的MATLAB实现与优化
开发语言·算法·matlab
cici1587444 分钟前
计算四连杆机构的运动学
线性代数·算法·机器学习
南烟斋..1 小时前
Linux系统编程核心知识指南
linux·算法