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); } }