Mergesort

Mergesort
是建立在归并操作上的一种有效的排序算法,
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为二路归并。

import java.util.Arrays;
public class MergeSort {

	public static void main(String[] args) {
		int[] arr = {1,7,10,9,5,2,17,8,4,0};
		mergeSort(arr, 0, arr.length-1);
		System.out.println(Arrays.toString(arr));
	}
	/**
	 * 该方法是将数组分成两边比较,
	 * low到mind mid+1到high各为一组,边遍历边比较,
	 * 将小者放入临时数组中,完成数组的升序
	 * @param arr	需要排序的数组
	 * @param low	数组的起始位(低位)
	 * @param middle	数组的中间位置
	 * @param high	数组的末尾(高位)
	 */
	public static void merge(int[] arr,int low,int middle,int high) {
		int[] temp = new int[high-low+1];	//临时数组大小应为low到high的范围
		int i = low;						//i从低位开始遍历
		int j = middle+1;					//j从mid+1开始遍历
		int index = 0;						//index作为临时数组temp的索引
		while(i<=middle && j<=high) {		//i和j在各自范围内遍历
			if(arr[i]<=arr[j]) {			//比较的最小值取出放入临时数组中
				temp[index++] = arr[i];
				i++;
			}else {
				temp[index++] = arr[j];
				j++;
			}
		}
		while(i<=middle) {		//此处当某一边元素取完,将另一边剩余元素放入temp
			temp[index++] = arr[i];
			i++;
		}
		while(j<=high) {
			temp[index++] = arr[j];
			j++;
		}
		for(int k=0;k<temp.length;k++) {
			arr[low+k] = temp[k];
		}
	}
	
	public static void mergeSort(int[] arr,int low,int high) {
		int middle = (high+low)/2;
		if(low<high) {	//将数组拆分成两边,进行递归
						//需要将数组每一块拆成足够小
			mergeSort(arr,low,middle);
			mergeSort(arr,middle+1,high);
			merge(arr,low,middle,high);
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值