数据结构排序算法之归并排序(JAVA)

归并排序介绍

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。

图解

在这里插入图片描述
在这里插入图片描述

代码

import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {
        int arr[]= {8, 4, 5 ,7, 1, 3, 6, 2};
        int temp[] = new int[arr.length];
        mergeSort(arr, 0, arr.length -1, temp);
        System.out.println("归并排序后" + Arrays.toString(arr));
    }

    public static void mergeSort(int[] arr, int left, int right,int[] temp) {
        if(left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr, left, mid, temp);
            mergeSort(arr, mid + 1, right, temp);
            merge(arr, left, mid, right, temp);
        }

    }


    /**
     * @param arr 排序的原始数组
     * @param left 左边有序序列的初始索引
     * @param mid   中间索引
     * @param right 右边有序序列的索引
     * @param temp 做中转的数组
     */
    //合并的方法
    public static void merge(int[] arr, int left, int mid ,int right, int[] temp){
        int i = left;  //初始化i,左边有序序列的初始索引
        int j = mid + 1; //初始化j,右边有序序列的初始索引
        int t = 0; //指向temp数组的当前索引

        while (i <= mid && j <= right) {
            if(arr[i] <= arr[j]) {
                temp[t] = arr[i];
                t += 1;
                i += 1;
            }else{
                temp[t] = arr[j];
                t += 1;
                j += 1;
            }
        }
        while( i <= mid) {
            temp[t] = arr[i];
            t += 1;
            i += 1;
        }
        while(j <= right) {
            temp[t]  = arr[j];
            t += 1;
            j += 1;
        }

        t = 0;
        int tempLeft = left;
        while(tempLeft <= right) {
            arr[tempLeft] = temp[t];
            t += 1;
            tempLeft += 1;
        }
        
    }


}

调试

另外大家在敲代码的时候可能会对递归执行的顺序产生疑惑,这里建议大家使用调试功能,本人敲代码的环境为Idea,接下来为大家简单演示一下调试的过程。
1.设置断点
在这里插入图片描述
选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。

2.开启调试会话

在这里插入图片描述

点击图中像爬虫一样的图标。

IDE下方出现Debug视图,左边的内容是现在调试程序停留的代码行,方法mergeSort()中,程序的第16行。右边的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。

3.单步调试(step into)
在这里插入图片描述

点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)

按这个方法一直执行下去,观察变量的值对应进行到哪一步,慢慢了解递归往下执行的步骤。

分析

归并排序是一种稳定的排序。
(1)时间复杂度
 对长度为n的文件,需进行趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlogn)。
(2)空间复杂度
  需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。

最后

文章学习来源:https://www.bilibili.com/video/BV1E4411H73v?p=71
(尚硅谷java数据结构)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了多种数据结构算法排序的实现。以下是一些常见的排序算法: 1. 冒泡排序(Bubble Sort):通过不断比较相邻元素并交换,将最大(或最小)的元素逐渐“冒泡”到最后(或最前)位置。时间复杂度为O(n^2)。 2. 选择排序(Selection Sort):每次选择未排序部分中最小(或最大)的元素,放到已排序部分的末尾(或开头)。时间复杂度为O(n^2)。 3. 插入排序(Insertion Sort):将未排序部分的元素逐个插入已排序部分的正确位置。时间复杂度为O(n^2)。 4. 快速排序(Quick Sort):通过选择一个基准元素,将列分为两个子列,其中一个子列的所有元素都小于(或大于)基准元素,然后递归地排序两个子列。时间复杂度平均情况为O(n log n)。 5. 归并排序(Merge Sort):将列拆分为多个子列,递归地对每个子列进行排序,然后合并这些有序子列以获得最终有序。时间复杂度为O(n log n)。 6. 堆排序(Heap Sort):将待排序元素构建成一个最大(或最小)堆,然后逐个移除堆顶元素并将其放入已排序部分。时间复杂度为O(n log n)。 7. 希尔排序(Shell Sort):将列按照一定的间隔分组,并对每个分组进行插入排序,然后逐渐缩小间隔,直到间隔为1,最后再进行一次插入排序。时间复杂度取决于间隔序列的选择。 Java中提供了Arrays类和Collections类来对数组和集合进行排序,可以使用它们的sort方法。另外,你也可以自己实现这些排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值