归并排序(重点在于子问题合并)

package demo;

import java.util.Arrays;

public class P37 {
	//归并排序,重点在于子问题合并
	//思路:辅助空间拷贝整个数组,左区开头、右区开头各有一个指针,比较后较小的值放回原数组,对应指针和原数组指针右移。
	public static void main(String[] args) {		
		int[] arr={10,16,4,5,25,13,20};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	
	static int[] helper;		//避免重复开辟空间
	static void sort(int[] arr) {		
		helper = new int[arr.length];
		mergeSort(arr,0,arr.length-1);
	}
	
	static void mergeSort(int[] arr , int s, int e){
		if(s<e) {
			int mid=s+((e-s)>>1);
			mergeSort(arr, s, mid);
			mergeSort(arr, mid+1, e);
			merge(arr,s,mid,e);
		}
	}
	
	static void merge(int[] arr , int s,int mid ,int e) {
		for(int i=s;i<=e;i++) {
			helper[i]=arr[i];
		}
		int origin=s;		//分别指向原数组、左区、右区
		int left=s;
		int right=mid+1;
		
		while(left<=mid && right<=e) {
			if(helper[left]<=helper[right]) {
				arr[origin]=helper[left];
				origin++;
				left++;
			}
			else {
				arr[origin]=helper[right];
				origin++;
				right++;
			}
		}
		
		while(left<=mid) {		//只有左边剩下要处理
			arr[origin]=helper[left];
			origin++;
			left++;
		}
		
	}

}
posted @   fighterk  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示