Day566.归并排序 数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day566.归并排序 数据结构和算法Java相关的知识,希望对你有一定的参考价值。

归并排序

一、介绍

二、基本思想


三、代码实现

package com.achang.sort;

import java.util.Arrays;

/**
 * @Author Achang
 * @Date 2022/3/23 21:31
 * 归并排序
 **/
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));
    


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

        //先把左右两边(有序)的数据按照规则填充到temp数组中
        //直到左右两边的有序序列有一边处理完毕为止
        while (i <= mid && j <= right) 
            //如果左边的有序序列当前元素小于或者等于右边的,就把他填充到temp中t的位置
            //然后就后移 i的位置 和 t的位置
            if (arr[i] <= arr[j]) 
                temp[t] = arr[i];
                t += 1;
                i += 1;
             else //反之,把右边的有序序列中的j位置的元素,填充到temp中t的位置,并后移 i的位置 和 t的位置
                temp[t] = arr[j];
                t += 1;
                j += 1;
            
        
        //把有剩余数据的一边的序列依次全部填充到temp中
        while (i <= mid)//说明左边有序序列有剩余元素,就全部填充到temp中
            temp[t] = arr[i];
            t += 1;
            i += 1;
        
        while (j <= right)//说明右有序序列有剩余元素,就全部填充到temp中
            temp[t] = arr[j];
            t += 1;
            j += 1;
        
        //将temp数组重新拷贝到arr中
        //并不是每次都拷贝所有的到arr中
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right)
            arr[tempLeft] = temp[t];
            t += 1;
            tempLeft += 1;
        

    

    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,right,mid,temp);
        
    


以上是关于Day566.归并排序 数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

常用排序算法及java示例

常用排序算法及java示例

排序算法--归并排序

排序算法入门之归并排序(java实现)

Java排序算法分析与实现:快排冒泡排序选择排序插入排序归并排序

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现