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的主要内容,如果未能解决你的问题,请参考以下文章