归并排序

1、合并两个有序数组

package helloworld;

import java.util.*;

public class Test {
	public static void merge(int[] a, int m, int[] b, int n, int[] tmp) {//m为a的末尾元素下标,n为b的末尾元素下标
		int i, j, k;
		i = j = k = 0;
		while (i <= m && j <= n) {//当a和b都没取完时
			if (a[i] < b[j]) {//当a的元素小于b的元素时
				tmp[k++] = a[i++];//把a的元素赋给tmp
			} else {
				tmp[k++] = b[j++];//把b的元素赋给tmp
			}
		}
		while (i <= m) {//上面的while跳出时,是a继续不为空
			tmp[k++] = a[i++];
		}
		while (j <= n) {
			tmp[k++] = b[j++];//上面的while跳出时,是b不为空
		}
	}
	public static void main(String[] args) {
		int[] a = { 1, 2, 3 };
		int[] b = { 2, 2, 3, 4, 5 };
		int[] tmp = new int[a.length + b.length];//建一个数组tmp,大小为a+b的大小
		merge(a, a.length - 1, b, b.length - 1, tmp);//调用merge方法
		for (Integer k : tmp) {//输出tmp的元素
			System.out.print(k + " ");
		}
	}
}	
输出:

1 2 2 2 3 3 4 5 
2、归并排序

import java.util.*;

public class Main {
	public static void merge(int[] a, int low, int mid, int high) {//a的左子数组和右子数组都是有序的,合并
		int[] temp = new int[high - low + 1];//建立一个存放元素的数组temp
		int i = low;
		int j = mid + 1;
		int k = 0;
		while (i <= mid && j <= high) {//当左子数组和右子数组都不为空
			if (a[i] < a[j]) {
				temp[k++] = a[i++];
			} else {
				temp[k++] = a[j++];
			}
		}
		while (i <= mid) {
			temp[k++] = a[i++];
		}
		while (j <= high) {
			temp[k++] = a[j++];
		}
		for (int k2 = 0; k2 < temp.length; k2++) {//将temp的元素赋给a
			a[low + k2] = temp[k2];
		}
	}
	public static void sort(int[] a, int low, int high) {//递归部分
		int mid = (low + high) / 2;
		if (low < high) {
			sort(a, low, mid);//左子数组有序
			sort(a, mid + 1, high);//右子数组有序
			merge(a, low, mid, high);//再合并左右
		}
	}
	public static void mergeSort(int[] a) {//将sort方法进行包装成mergeSort,直接输入数组
		if (a != null) {
			sort(a, 0, a.length - 1);
		}
	}
	public static void main(String[] args) {
		int[] a = { 9,8,7,6,5,1,2,3,4 };
		mergeSort(a);//调用mergeSort方法
		System.out.println(Arrays.toString(a));
	}
}
输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值