用Java泛型實現快速排序
阿新 • • 發佈:2019-02-20
package ch10; public class QuickSort { /** * successfully-快速排序 * 使用了泛型-自然排序 * @param <T> * @param t */ public static <T extends Comparable> void quikSort(T[] t){ recursiveSort(t, 0, t.length-1); } /** * 快速排序-遞迴呼叫 * @param <T> * @param t * @param low * @param high */ private static <T extends Comparable> void recursiveSort(T[] t, int low, int high){ if(t == null || low >= high) return; int pivotLoc = partition(t, low, high); //先對長度較短的子序列進行快速排序,以使棧的最大深度在最壞情況下降為O(logn) if(pivotLoc-low > high-pivotLoc){ recursiveSort(t, pivotLoc+1, high); recursiveSort(t, low, pivotLoc-1); }else{ recursiveSort(t, low, pivotLoc-1); recursiveSort(t, pivotLoc+1, high); } } /** * 快速排序-一次劃分 * @param <T> * @param t * @param low * @param high * @return */ private static <T extends Comparable> int partition(T[] t, int low, int high){ selectPivotKey(t, low, high); // System.out.println("low---"+t[low]); T pivotKey = t[low]; while(low < high){ while(t[high].compareTo(pivotKey)>=0 && low<high){ high--; } t[low] = t[high]; while(t[low].compareTo(pivotKey)<=0 && low<high){ low++; } t[high] = t[low]; } t[low] = pivotKey; return low; } /** * 快速排序-三者取中來設定pivotKey * @param <T> * @param t * @param low * @param high * @return */ private static <T extends Comparable> boolean selectPivotKey(T[] t, int low, int high) { if(t==null || low < 0 || high > t.length){ throw new IllegalArgumentException("引數傳遞不正確"); } T min = t[low]; T mid = t[(low+high)/2]; T max = t[high]; if(min.compareTo(mid) > 0){ T temp = min; min = mid; mid = temp; } if(max.compareTo(min) < 0) mid = min; else if(max.compareTo(mid) < 0) mid = max; if(mid.compareTo(t[low]) == 0) return true; else if(mid.compareTo(t[(low+high)/2]) == 0){ return swap(t, low, (low+high)/2); }else{ return swap(t, low, high); } } /** * 交換陣列中的元素 * @param <T> * @param t * @param i * @param j */ private static <T> boolean swap(T[] t, int i, int j){ if(i<0 || i>=t.length || j<0 || j>=t.length) return false; if(t == null) return true; T temp = t[i]; t[i] = t[j]; t[j] = temp; return true; } public static void main(String[] args) { Integer[] arr = new Integer[]{1,2,5,4,5,6,7,8,9}; QuickSort.<Integer>quikSort(arr); for(int i : arr){ System.out.println(i); } } }