星星博客 »  > 

归并排序(Java实现)

归并排序

归并排序分为两步,分别是:合并、分治。

接下来先看合并的原理:

首先保证前一半跟后一半都有序。
①先创建两个新数组。
②将前一半的数组元素赋值到Left数组中,
将后一半的数组元素赋值到Right数组中。
③设置下标i,j,k,从小到大填入arr数组。
在这里插入图片描述

分治的原理,就是递归调用:

接下来上代码:

import java.util.Arrays;
//归并排序主要分两个步骤:合并、分治

public class __GuiBingPaiXu {
	public static void main(String[] args) {
		int[] arr = new int[] {5,7,9,10,3,4,8,12};
		Sort(arr);
		System.out.println(Arrays.toString(arr));
		
	}
	//封装一下
	static void Sort(int[] arr) {
		mergesort(arr, 0, arr.length-1);
	}
	
	//分治
	static void mergesort(int[] arr, int L, int R) {
		if(L==R) {
			return;
		}else {
			int M = (L+R)/2;
			mergesort(arr, L, M);
			mergesort(arr, M+1, R);
			merge(arr, L, M+1, R);
		}
	}
	
	//合并
	static void merge(int[] arr, int L, int M, int R) {
		//定义数组大小
		int LeftSize = M-L;
		int RightSize = R-M+1;
		//创建两个新数组
		int[] Left = new int[LeftSize];
		int[] Right = new int[RightSize];
		//分别将相应元素赋值到新数组中
		for (int i = L; i < M; i++) {
			Left[i-L] = arr[i];
		}
		for (int i = M; i <= R; i++) {
			Right[i-M] = arr[i];
		}
		int i = 0;
		int j = 0;
		int k = L;	//注意:这里从L开始
		//将两个数组中的数据从小到大存到arr中
		while(i<LeftSize&&j<RightSize) {
			if(Left[i]<Right[j]) {
				arr[k++] = Left[i++];
			}else {
				arr[k++] = Right[j++];
			}
		}
		while(i<LeftSize) {
			arr[k++] = Left[i++];
		}
		while(j<RightSize) {
			arr[k++] = Right[j++];
		}
	}
}

相关文章