归并排序-java实现

归并排序:

归并排序是一种递归排序算法,通过将列表递归分成两半直到每一个子列表都只含有一个元素,然后将这些子列表按顺序重组,这样就完成了对整个列表的排序。


排序策略:

1.将列表分成两个大约相等的子列表;
2.对每个子列表递归调用自身;
3.当整个列表被分成长度都为1的子列表时,归并排序的分解步骤完成;
4.递归将两个子列表整合成一个排好序的子列表;
5.当所有子列表归并完成,整个列表即完成排序。


例子:

分解部分:


归并部分:




Code:

/*
*Created on 2016年7月11日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/

package org.cy.sort;

public class MergeSort {

	public static void main(String[] args) {
		String[] str = {"nba", "haha", "zxy", "test", "abc"};
		printArr(mergeSort(str, 0, str.length - 1));
	}
	
	public static <T extends Comparable<T>> T[] mergeSort(T[] data, int minIndex, int maxIndex){
		if(minIndex < maxIndex){
			int mid = (minIndex + maxIndex) / 2;
			mergeSort(data, minIndex, mid);
			mergeSort(data, mid + 1, maxIndex);
			mergeSort(data,minIndex,mid,maxIndex);
		}
		return data;
	}
	
	
	public static <T extends Comparable<T>> void mergeSort(T[]data, int first, int mid, int last){
		T[] tmp = (T[])(new Comparable[data.length]);
		int first1 = first;
		int last1 = mid;
		int first2 = mid + 1;
		int last2 = last;
		int index = first1;
		
		while(first1 <= last1 && first2 <= last2){
			if(data[first1].compareTo(data[first2]) < 0){
				tmp[index] = data[first1];
				first1++;
			}else{
				tmp[index] = data[first2];
				first2++;
			}
			index++;
		}
		
		while(first1 <= last1){
			tmp[index] = data[first1];
			first1++;
			index++;
		}
		
		while(first2 <= last2){
			tmp[index] = data[first2];
			first2++;
			index++;
		}
		
		for(index = first;index <= last; index++){
			data[index] = tmp[index];
		}
	}
	
	public static <T> void printArr(T[] data){
		int len = data.length;
		for(int i = 0; i < len; i++){
			System.out.print(data[i] + " ");
		}
		System.out.println();
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值