詳解Java中應用泛型完成疾速排序算法的辦法。本站提示廣大學習愛好者:(詳解Java中應用泛型完成疾速排序算法的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中應用泛型完成疾速排序算法的辦法正文
疾速排序算法概念
疾速排序普通基於遞歸完成。其思緒是如許的:
1.選定一個適合的值(幻想情形中值最好,但完成中普通應用數組第一個值),稱為“樞軸”(pivot)。
2.基於這個值,將數組分為兩部門,較小的分在右邊,較年夜的分在左邊。
3.可以確定,如斯一輪上去,這個樞軸的地位必定在終究地位上。
4.對兩個子數組分離反復上述進程,直到每一個數組只要一個元素。
5.排序完成。
根本完成方法:
public static void quickSort(int[] arr){ qsort(arr, 0, arr.length-1); } private static void qsort(int[] arr, int low, int high){ if (low < high){ int pivot=partition(arr, low, high); //將數組分為兩部門 qsort(arr, low, pivot-1); //遞歸排序左子數組 qsort(arr, pivot+1, high); //遞歸排序右子數組 } } private static int partition(int[] arr, int low, int high){ int pivot = arr[low]; //樞軸記載 while (low<high){ while (low<high && arr[high]>=pivot) --high; arr[low]=arr[high]; //交流比樞軸小的記載到左端 while (low<high && arr[low]<=pivot) ++low; arr[high] = arr[low]; //交流比樞軸小的記載到右端 } //掃描完成,樞軸到位 arr[low] = pivot; //前往的是樞軸的地位 return low; }
應用泛型完成快排算法
上面設計一個QuickSort類,包括了靜態函數sort(),可以對隨意率性類型數組停止排序。假如為對象類型數組,則該對象類型必需完成Comparable接口,如許能力應用compareTo函數停止比擬。
應用了最根本的快排算法,沒有停止優化處置。
源代碼以下:
import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Random; public class QuickSort { @SuppressWarnings("unchecked") //對上述快排函數原型修正,使其可以對隨意率性對象類型數組停止排序。這個函數為外部應用,內部排序函數接口為sort(),sort函數請求對象必需完成Comparable接口,可以供給編譯時類型檢測,見後文。 private static void quickSort(Object[] in,int begin, int end) { if( begin == end || begin == (end-1) ) return; Object p = in[begin]; int a = begin +1; int b = a; for( ; b < end; b++) { //該對象類型數組必需完成Comparable接口,如許能力應用compareTo函數停止比擬 if( ((Comparable<Object>)in[b]).compareTo(p) < 0) { if(a == b){a++; continue;} Object temp = in[a]; in[a] = in[b]; in[b] = temp; a++; } } in[begin] = in[a-1]; in[a-1] = p; if( a-1 > begin){ quickSort(in,begin, a); } if( end-1 > a ) { quickSort(in,a, end); } return; } //應用泛型,對隨意率性對象數組排序,該對象類型數組必需完成Comparable接口 public static <T extends Comparable<? super T>> void sort(T[] input){ quickSort(input,0,input.length); } //添加對List對象停止排序的功效,參考了Java中的Java.util.Collections類的sort()函數 public static <T extends Comparable<? super T>> void sort(List<T> list){ Object[] t = list.toArray();//將列表轉換為數組 quickSort(t,0,t.length); //對數組停止排序 //數組排序完成後再寫回到列表中 ListIterator<T> i = list.listIterator(); for (int j=0; j<t.length; j++) { i.next(); i.set((T)t[j]); } } //因為Java華夏始數據類型(int、double、byte等)沒法應用泛型,所以只能應用函數重載機制完成對這些原始類型數組(int[]、double[]、byte[]等)的排序。這裡為了共用統一個排序函數,應用原始類型的(AutoBoxing,UnBoxing)機制將其封裝為對應對象類型,構成新的對象數組,排序後再解封裝,如許的缺陷是須要額定的轉換步調、額定的空間保留封裝後的數組。另外一種方法是將排序代碼復制到各個重載函數中,官方API中的Java.util.Arrays這個類中的sort()函數就是應用這類辦法,可以從Arrays類的源代碼看出。 public static void sort(int[] input){ Integer[] t = new Integer[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i];//封裝 } quickSort(t,0,t.length);//排序 for(int i = 0; i < input.length; i++){ input[i] = t[i];//解封裝 } } //double[]數組的重載函數 public static void sort(double[] input){ Double[] t = new Double[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i]; } quickSort(t,0,t.length); for(int i = 0; i < input.length; i++){ input[i] = t[i]; } } //byte[]數組的重載函數 public static void sort(byte[] input){ Byte[] t = new Byte[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i]; } quickSort(t,0,t.length); for(int i = 0; i < input.length; i++){ input[i] = t[i]; } } //short[]數組的重載函數 public static void sort(short[] input){ Short[] t = new Short[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i]; } quickSort(t,0,t.length); for(int i = 0; i < input.length; i++){ input[i] = t[i]; } } //char[]數組的重載函數 public static void sort(char[] input){ Character[] t = new Character[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i]; } quickSort(t,0,t.length); for(int i = 0; i < input.length; i++){ input[i] = t[i]; } } //float[]數組的重載函數 public static void sort(float[] input){ Float[] t = new Float[input.length]; for(int i = 0; i < input.length; i++){ t[i] = input[i]; } quickSort(t,0,t.length); for(int i = 0; i < input.length; i++){ input[i] = t[i]; } } //測試用的main函數 public static void main(String[] args) { //臨盆一個隨機數構成的int[]數組,用來測試 int LEN = 10; int[] input = new int[LEN]; Random r = new Random(); System.out.print("int[] before sorting: "); for(int i = 0; i < input.length; i++) { input[i] = r.nextInt(10*LEN); System.out.print(input[i] + " "); } System.out.println(); System.out.print("int[] after sorting: "); sort(input); for(int i : input) { System.out.print(i + " "); } System.out.println(); //生成一個字符串數組,用來測試 String[] s = new String[]{"b","a","e","d","f","c"}; System.out.print("String[] before sorting: "); for(int i = 0; i < s.length; i++) { System.out.print(s[i] + " "); } System.out.println(); System.out.print("String[] after sorting: "); sort(s); for(int i = 0; i < s.length; i++) { System.out.print(s[i] + " "); } System.out.println(); //生成一個字符串列表,用來測試 List<String> l = new LinkedList<String>(); s = new String[]{"b","a","e","d","f","c"}; System.out.print("LinkedList<String> before sorting: "); for (int j=0; j<s.length; j++) { l.add(s[j]); System.out.print(s[j] + " "); } System.out.println(); sort(l); System.out.print("LinkedList<String> after sorting: "); for (String ts : l) { System.out.print(ts + " "); } System.out.println(); } }
運轉main函數測試,從輸入可以看出QuickSort類任務正常:
int[] before sorting: 65 48 92 26 3 8 59 21 16 45 int[] after sorting: 3 8 16 21 26 45 48 59 65 92 String[] before sorting: b a e d f c String[] after sorting: a b c d e f LinkedList<String> before sorting: b a e d f c LinkedList<String> after sorting: a b c d e f