首页 > 其他分享 >归并排序

归并排序

时间:2022-09-26 16:00:11浏览次数:41  
标签:归并 right temp int arr mid 排序 left

归并排序

思想:

  1. 将数组不断划分,只到不可再分为止(划分阶段仅划分,不做其他任何处理);
  2. 再讲划分后的数组进行排序合并。

代码实现:

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);
        }
    }
    /**
     * @Description 合并的方法
     * @param arr 待排序数组
     * @param left  左边有序序列的初始索引
     * @param mid 中间索引
     * @param right 右边索引
     * @param temp 中转数组
     */
    private static void merge(int[] arr, int left, int mid, int right,int[]temp) {
        int i=left  ;
        int j=mid+1;
        int t=0;
        //1.想把左右两边(有序数组)的数组按照规则填充到temp数组
        //知道左右两边的有序数组有一方处理完毕为止
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                temp[t] = arr[i];
                i++;
                t++;
            }else{
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //2.当一方处理完毕后,把没有处理完毕的剩下数据拷贝到temp数组
        while (i <= mid) {
            temp[t] = arr[i];
            t++;
            i++;
        }
        while (j <= right) {
            temp[t] = arr[j];
            t++;
            j++;
        }
        //3.将temp数组中的全部拷贝到arr数组中
        t=0;
        while (left <= right) {
            arr[left] = temp[t];
            left++;
            t++;
        }
    }
}

标签:归并,right,temp,int,arr,mid,排序,left
From: https://www.cnblogs.com/yufou/p/16731240.html

相关文章

  • R语言:对同时包含字母和数字的列进行排序(order columns containing numbers and letter
    原始数据如下所示:现在想对第一列和第二列进行排序,得到如下结果:则可以使用代码:sort=ori[order(as.numeric(sub("\\chr+","",ori$V1)),ori$V2),]......
  • 堆排序
    简介堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树......
  • 14 -- 排序算法之冒泡排序
    冒泡排序的基本思想:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的数逐渐从前移向后,就像水底下的气泡一样逐渐向上冒。......
  • 手撕快速排序(含图解和两种实现代码)
    摘要1.快速排序其实也是分而治之的思想2.快速排序是递归的3.首先找一个基准点,把比基准点小的数字都放到它的左边,比它大的数字都放在它的右边,一趟下来基准点的位置找......
  • 排序算法总结
    本文参考十大经典排序算法总结|JavaGuide,感谢Guide哥!十大经典排序算法总结本文转自:十大经典排序算法最强总结(含Java、Python码实现)|郭耀华'sBlog(guoyaohua.c......
  • CSP-S模拟11[回文, 快速排序, 混乱邪恶, 校门外歪脖树上的鸽子]
    T1回文显然,这玩意和传纸条长得贼像,然后对于我赛时调了\(1\)个多小时的\(n^{2}\)做法感到抱歉....我tnm竟然想优化复杂度?看到数据范围,显然可以发现\(n^{4}\)过......
  • 排序算法
    内部排序这里先介绍一个概念,算法稳定性算法稳定性--假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!......
  • 王道-考研-数据结构-二叉排序树
    二叉树的应用1.二叉排序树BST,也称二叉查找树。二叉排序树或者为空树,或者为非空树,当为非空树时有如下特点:若左子树非空,则左子树上所有结点关键字值均小于根结点的关键......
  • thinkphp 分页查询中order排序失效原因
    $this->db->order("positiondesc")->paginate(2);一个排序功能,根据某字段的大小值排序,发现order失效;原因如下:object(think\paginator\driver\Bootstrap)#20(9){......
  • 基数排序
    简介基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”......