Java 泛型应用 及归并排序的实现

package util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Sort {
	/**
	 * 归并排序法
	 * 传入的Object数组必须实现了Comparable接口的compareTo方法
	 * 不然报错
	 * 没有设置多余的传入参数,因而需要拷贝数组两次
	 * 时间复杂度固定为 O(n+2nlog2n)
	 * 通过递归,将数组按1:1切分,到只有一个元素时,此时数组是排序好的
	 * 然后通过大小比较组合
	 * @param arr
	 * @author 风潇潇
	 */
	public static  void binnerySort(Object[] arr){
		if(arr.length>1){
			Object[] arr1=Arrays.copyOfRange(arr, 0, arr.length/2);
			Object[] arr2=Arrays.copyOfRange(arr, arr.length/2, arr.length);
			binnerySort(arr1);
			binnerySort(arr2);
			int n1=0,n2=0;
			for(int i=0;i<arr.length;i++){
				if(n1<arr1.length&&n2<arr2.length){
					if(((Comparable)arr1[n1]).compareTo(arr2[n2])<0){
						arr[i]=arr1[n1++];
					}
					else{
						arr[i]=arr2[n2++];
					}
				}
				else if(n1<arr1.length){
					arr[i]=arr1[n1++];
				}
				else if(n2<arr2.length){
					arr[i]=arr2[n2++];
				}
			}
		}
	}
	/**
	 * 利用泛型设置类型检查
	 * <T extends Comparable<T>>要求传入的数组类型必须是可比的即实现了Comparable的compareTo
	 * <T extends Comparable<?super T>>指若T的父类型实现了可比亦可
	 * 具体实现同归并排序类似
	 * @param arr
	 */
	public static <T extends Comparable<T>> void sort(T[] arr){
		if(arr.length>1){
			T[] arr1=Arrays.copyOfRange(arr, 0, arr.length/2);
			T[] arr2=Arrays.copyOfRange(arr, arr.length/2, arr.length);
			sort(arr1);
			sort(arr2);
			int n1=0,n2=0;
			for(int i=0;i<arr.length;i++){
				if(n1<arr1.length&&n2<arr2.length){
					if(((Comparable)arr1[n1]).compareTo(arr2[n2])<0){
						arr[i]=arr1[n1++];
					}
					else{
						arr[i]=arr2[n2++];
					}
				}
				else if(n1<arr1.length){
					arr[i]=arr1[n1++];
				}
				else if(n2<arr2.length){
					arr[i]=arr2[n2++];
				}
			}
		}
	}
	/**
	 * 基于Object[]数组排序实现
	 * 注意传入的泛型必须是实现了Comparable
	 * 因无法创建泛型数组,必须通过Object排序后再强转
	 * 因而无法添加泛型检查
	 * @param list
	 */
	public static <T> void sort(List<T> list){
		Object[] arr = list.toArray();
		binnerySort(arr);
		for(int i=0;i<arr.length;i++){
			list.set(i, (T)arr[i]);
		}
	}
	/**
	 * 数组排序,使用泛型Comparator接口
	 * 可以通过实现Comparator接口重写compare方法来界定自己要求的排序
	 * @param arr
	 * @param com
	 */
	public static <T> void sort(Object[] arr ,Comparator<T> com){
		if(arr.length>1){
			Object[] arr1=Arrays.copyOfRange(arr, 0, arr.length/2);
			Object[] arr2=Arrays.copyOfRange(arr, arr.length/2, arr.length);
			sort(arr1,com);
			sort(arr2,com);
			int n1=0,n2=0;
			for(int i=0;i<arr.length;i++){
				if(n1<arr1.length&&n2<arr2.length){
					if(com.compare((T)arr1[n1],(T)arr2[n2])<0){
						arr[i]=arr1[n1++];
					}
					else{
						arr[i]=arr2[n2++];
					}
				}
				else if(n1<arr1.length){
					arr[i]=arr1[n1++];
				}
				else if(n2<arr2.length){
					arr[i]=arr2[n2++];
				}
			}
		}
	}
	
	public static <T> void sort(List<T>list ,Comparator<T> com){
		Object[] arr = list.toArray();
		sort(arr,com);
		for(int i=0;i<arr.length;i++){
			list.set(i, (T)arr[i]);
		}
	}
	
	
	public static void main(String[] args){
		List<String> list = new ArrayList<String>();
		list.add("aaa");
		list.add("a");
		list.add("abs");
		list.add("abcef");
		list.add("defg");
		sort(list,new StrCompare());
		System.out.println(list);
		
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章