基础算法之合并排序Java实现

本文详细介绍了一种高效的排序算法——合并排序。该算法采用分治策略,将数组不断分为两半直至每个子数组只有一个元素,再将有序的子数组逐步合并为更大的有序数组。文中提供了完整的Java实现代码及示例。
package com.gary.合并排序;
/**
 * 合并排序算法是用分治策略实现对N个元素进行排序的算法。其基本思想是:<br>
 * 将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。<br>
 * 主要思想:1.分治 : 将N个元素集合二分直到不能分为止<br>
 *       
 *       
 *   
 *  2.合并:先合并到另一个临时的数组temp[]中。<br>
 *  合并时候,比较值小的放入temp数组中,并且放入的那边位置++,继续比较<br>
 *  直到值全部排好序到temp[]数组中后,将temp[]数组通过copy函数复制到原本的数组中去
 * @author gary
 *
 */
public class Merge {
	/**
	 * 分治 : 将N个元素集合二分直到不能分为止<br>
	 */
	public void mergeSort(int[] arrays, int start, int end) {
		if(start < end) {
			int m = (start + end)/2;
			mergeSort(arrays, start, m);
			mergeSort(arrays, m+1, end);
			combine(arrays, start, m, end);
		}
	}
	/**
	 * 合并:先合并到另一个临时的数组temp[]中。<br>
	 *合并时候,比较值小的放入temp数组中,并且放入的那边位置++,继续比较<br>
	 *直到值全部排好序到temp[]数组中后,将temp[]数组通过copy函数复制到原本的数组中去
	 */
	private void combine(int[] arrays, int start, int m, int end) {
		int length = end - start + 1;
		int temp[] = new int[length];
		int i = start;
		int j = m+1;
		int k = 0;
		while(i <= m && j <= end) {
			if(arrays[i] < arrays[j]) {
				temp[k] = arrays[i];
				i++;
				k++;
			} else {
				temp[k] = arrays[j];
				j++;
				k++;
			}
		}
		while(i <= m) {
			temp[k] = arrays[i];
			i++;
			k++;
		}
		while(j <= end) {
			temp[k] = arrays[j];
			j++;
			k++;
		}
		copy(arrays, start, end, temp);
		
	}

	private void copy(int[] arrays, int start, int end, int[] temp) {
		int j = 0;
		for(int i = start; i <= end; i++,j++) {
			arrays[i] = temp[j];
		}
		print(arrays);;
	}

	private void print(int[] arrays) {
		for(int i = 0; i < arrays.length; i++) {
			System.out.print(arrays[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int a[] = {5,4,10,8,7,9,11,6,8,5,5};
		new Merge().mergeSort(a, 0, a.length - 1);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值