数据结构与算法-常用排序算法(2)

本文探讨了归并排序的原理,它通过将两个有序数组合并来创建一个有序数组。在实际操作中,归并排序使用递归策略不断将数组分为两半,直到每个部分仅包含一个元素,然后进行有序合并。值得注意的是,在将合并后的临时数组元素加入原数组时,不能直接赋值,因为临时数组的长度在递归过程中会变化。
摘要由CSDN通过智能技术生成

5.归并排序

归并的思想理解:

对两个有序的数组, 例如 1,3,5,7 和2,4,6,8,10这样两个数组,可以合并为一个数组

通过遍历两个数组再进行比较,把比较结果依次加入用于存储合并后的临时数组

 

在具体的实现时,相当于帮一个数组无限划分为两份,直到左右各为一份,此时左右是有序的,排序后合并,

让之后的每次操作都满足左右有序,利用递归去完成归并

 

package math;

import java.util.Arrays;

public class MergeSort {

	public static void main(String[] args) {
	int[]  arr  =  new int[]{4,7,2,3,9,13};
		
	 new MergeSort().mergesort(arr, 0,arr.length-1);
		
		System.out.println(Arrays.toString(arr));
		

	}
	
	
	public void mergesort(int[] arr , int sta ,int end){
		
		int middle = (sta+end)/2 ;
		if(sta<end){
		mergesort(arr, sta, middle);
		mergesort(arr, middle+1, end);
		merge(arr, sta, middle, end);
		}
		
		
		
	}
	
	
	
	
	//middle两侧数组已经有序
	public void merge(int[] arr ,int low , int middle,int high ){
		
		//存储操作后的临时数组
		int[]  temp = new int[high-low+1];
		//第一个数组的开始
		int i = low ;
		//第二个数组的开始
		int j = middle+1 ;
		//用于给临时数组加入元素的下标
		int index = 0 ;
		
		while(i<=middle&&j<=high){
			
			if(arr[i]>arr[j]){
				
				temp[index++]=arr[j++];
				
			}else{
				
				temp[index++]=arr[i++];
				
			}
		}
		
		//此时如果左右两侧的数组长度不一样,则某一侧的剩余也要处理
		while(i<=middle){
			
			temp[index++]=arr[i++];
			
		}
		
		while(j<=high){
			temp[index++]=arr[j++];
		}
		
		//把有序的临时数组给放入原数组
		for(int k = 0;k<(high-low+1);k++){
			
			arr[low+k]=temp[k];
			
		}
	}
}

关于最后一步把临时数组元素加入原数组不能直接arr=temp ;

应为在递归操作时输入数组长度arr是一定的 ,但我们的temp是对递归的划分大小变化的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值