java实现自顶向下的归并排序

自顶向下归并排序:

排序如图所示

public class MergeTOP {
    
    

	//①:递归调用sort将数组分为单个元素,再一层一层返回
	private static void sort(int[] a, int lo, int hi) {
    
    
		if(hi <= lo) return ;//将数组分为单个元素时停止
		int mid = lo + (hi - lo) / 2;
		sort(a, lo, mid);//左半边排序
		sort(a, mid + 1, hi);//右半边排序
		merge(a, lo, mid, hi);//归并排序结果
	}
	//②:归并排序的原理
	public static void merge(int[] a, int lo, int mid, int hi) {
    
    
		int[] ca = new int[a.length];
		for (int i = 0; i < a.length; i++) {
    
    
			ca[i] = a[i];//数组复制和元素拷贝,接下来操作拷贝的数组
		}
		mid = lo + (hi - lo) / 2;
		int p1 = lo;//分别定义指向拷贝数组的左右指针
		int p2 = mid + 1;
		for (int i = lo; i <= hi; i++) {
    
    
			if(p2 > hi) a[i] = ca[p1++];
			//当右边越界时,即将右边比较完了,此时将左边的元素依次写入数组中
			else if(p1 > mid) a[i] = ca[p2++];
			//当左右边越界时,即将左右边比较完了,此时将右左边的元素依次写入数组中
			else if(ca[p1] < ca[p2]) a[i] = ca[p1++];
			//右边元素小于左边,将右边元素写入数组
			else a[i] = ca[p2++];
			//相反
		}
	}
 	//③:将数组归并排序全部完成
	public static void sort(int[] a) {
    
    
		int[] ca = new int[a.length];//分配内存
		sort(a, 0, a.length - 1);
	}
	
	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub

		int[] a = {
    
    12,78,56,14,95,30,75,10,29,55,10,96,11};
		sort(a);
		System.out.println(Arrays.toString(a));
	}
}

[10, 10, 11, 12, 14, 29, 30, 55, 56, 75, 78, 95, 96]

猜你喜欢

转载自blog.csdn.net/weixin_45734378/article/details/107459837
今日推荐