Java之归并排序

归并排序

归并排序(Merge Sort)算法,使用的是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。

核心源码: mergeSort(m->n) = merge(mergeSort(m->k),mergeSort(k+1->n));

算法思路:

​ 如果要排序一个数组,先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。具体见下图:

在这里插入图片描述

注意:分治思想跟递归思想很相似。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突,分治算法一般都是用递归来实现。

具体代码实现如下:

import java.util.Arrays;
import org.junit.Test;

/**
 * 
* @ClassName: MergeSort
* @author shaoyb
* @date 2020年12月9日
* @Description: 归并排序
* 归并排序思路:
*	1、把长度为n的序列一分为二成两个子序列;
	2、对这两个子序列分别采用归并排序;
	3、将两个排序好的子序列合并成一个最终的排序序列。
 */
public class MergeSort {
	
	/**
	 * 归并排序算法实现
	 * @param arr 需要排序的数组
	 * @return 排序成功后新数组
	 */
	public int[] mergeSort(int[] arr){
		//1.确定递归终止条件
		if(arr.length < 2) {
			return arr;
		}
		
		//2.拆解数组成左右两部分
		int mid = arr.length/2;
		int[] left = Arrays.copyOfRange(arr,0,mid);
		int[] right = Arrays.copyOfRange(arr,mid,arr.length);
		
		//3.对拆解后两个数组进行合并
		return merge(mergeSort(left),mergeSort(right));
	}
	
	/**
	* 合并两个有序数组,并返回合并后的新数组
	* @param left
	* @param right
	*/
	public int[] merge(int[] left,int[] right) {
		//1.定义好新数组
		int[] newArray = new int[left.length + right.length];
		
		//2.往新数组中逐个添加元素
		int lIndex = 0;
		int rIndex = 0;
		for(int i = 0; i < newArray.length; i++) {
			if(lIndex >= left.length) {
				//左数组已经遍历完成
				newArray[i] = right[rIndex++];
			}else if(rIndex >= right.length) {
				//右数组已经遍历完成
				newArray[i] = left[lIndex++];
			}else if(left[lIndex] < right[rIndex]) {
				//左数组当前元素值小于右数组
				newArray[i] = left[lIndex++];
			}else {
				//右数组当前元素值小于左数组
				newArray[i] = right[rIndex++];
			}
		}
		
		return newArray;
	}
		
	@Test
	public void testMergeSort(){
		//1.定义数组
		int[] array = new int[] {5,2,6,9,0,3};
		
		System.out.println("排序前" + Arrays.toString(array));
		
		//2.归并排序
		array = mergeSort(array);
		
		System.out.println("排序后" + Arrays.toString(array));
	}	
}
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种常见的排序算法,它采用分治的思想,将一个大问题分解为多个小问题进行解决,最后将结果合并得到最终的排序结果。下面是Java中使用归并排序的示例代码: ```java public class MergeSort { public static void mergeSort(int[] arr) { if (arr == null || arr.length <= 1) { return; } int[] temp = new int[arr.length]; mergeSort(arr, 0, arr.length - 1, temp); } private 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); // 合并左右两部分 } } private static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; // 左序列指针 int j = mid + 1; // 右序列指针 int t = 0; // 临时数组指针 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[t++] = arr[i++]; } else { temp[t++] = arr[j++]; } } while (i <= mid) { // 将左边剩余元素填充进temp中 temp[t++] = arr[i++]; } while (j <= right) { // 将右序列剩余元素填充进temp中 temp[t++] = arr[j++]; } t = 0; // 将temp中的元素全部拷贝到原数组中 while (left <= right) { arr[left++] = temp[t++]; } } } ``` 使用归并排序时,可以调用`mergeSort`方法传入待排序的数组即可完成排序。在`mergeSort`方法中,首先判断数组是否为空或长度小于等于1,如果是,则直接返回。然后创建一个临时数组`temp`,并调用`mergeSort`方法进行递归排序。在递归排序的过程中,将数组分为左右两部分,分别对左右两部分进行归并排序,最后调用`merge`方法将左右两部分合并起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值