隨機化快速排序法

來源:互聯網
上載者:User

標籤:name   rac   tar   處理   invoke   完全   .com   EDA   ndt   

   為什麼要有隨機化快速排序。對於快速排序大家知道,如果選取某個固定的值作為分界點(左邊小於當前值,右邊大於當前值),當排序的數組近乎有序,極有可能退化成O(n^2)層級的演算法,因為拆分的數組極不均勻,兩邊的數組大小相差太大。如果採取隨機化選取分界點,這樣的化退化成O(n^2)幾乎為零。

 

    

package com.newtouch.data.sort;import com.newtouch.data.test.SortTestHelper;public class QuickSortRandomly {    //我們的演算法不允許產生任何執行個體    private QuickSortRandomly() {    }    // 對arr[l...r]部分進行partition操作    // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]    private static int partition(Comparable[] arr, int l, int r) {        // 隨機在arr[l...r]的範圍中, 選擇一個數值作為標定點pivot        swap(arr, l, (int) (Math.random() * (r - l + 1)) + l);        Comparable v = arr[l];        int j = l;// arr[l+1...j] < v ; arr[j+1...i) > v        for (int i = l + 1; i <= r; i++)            if (arr[i].compareTo(v) < 0) {                j++;                swap(arr, j, i);            }        swap(arr, l, j);        return j;    }    private static void swap(Object[] arr, int i, int j) {        Object t = arr[i];        arr[i] = arr[j];        arr[j] = t;    }    private static void sort(Comparable[] arr, int l, int r) {        if (l >= r)            return;        int p = partition(arr, l, r);        sort(arr, l, p - 1);        sort(arr, p + 1, r);    }    public static void sort(Comparable[] arr) {        int n = arr.length;        sort(arr, 0, n - 1);    }    public static void main(String[] args) {        // Quick Sort也是一個O(nlogn)複雜度的演算法        // 可以在1秒之內輕鬆處理100萬數量級的資料        int N = 1000000;        Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);        SortTestHelper.testSort("com.newtouch.data.sort.QuickSort", arr);        return;    }}
測試輔助類SortTestHelper代碼:
package com.newtouch.data.test;import java.lang.reflect.Method;import java.lang.Class;import java.util.Random;public class SortTestHelper {    // SortTestHelper不允許產生任何執行個體    private SortTestHelper() {    }    // 產生有n個元素的隨機數組,每個元素的隨機範圍為[rangeL, rangeR]    public static Integer[] generateRandomArray(int n, int rangeL, int rangeR) {        assert rangeL <= rangeR;        Integer[] arr = new Integer[n];        for (int i = 0; i < n; i++)            arr[i] = new Integer((int) (Math.random() * (rangeR - rangeL + 1) + rangeL));        return arr;    }    // 產生一個近乎有序的數組    // 首先產生一個含有[0...n-1]的完全有序數組, 之後隨機交換swapTimes對資料    // swapTimes定義了數組的無序程度:    // swapTimes == 0 時, 數組完全有序    // swapTimes 越大, 數組越趨向於無序    public static Integer[] generateNearlyOrderedArray(int n, int swapTimes) {        Integer[] arr = new Integer[n];        for (int i = 0; i < n; i++)            arr[i] = new Integer(i);        for (int i = 0; i < swapTimes; i++) {            int a = (int) (Math.random() * n);            int b = (int) (Math.random() * n);            int t = arr[a];            arr[a] = arr[b];            arr[b] = t;        }        return arr;    }    // 列印arr數組的所有內容    public static void printArray(Object[] arr) {        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i]);            System.out.print(‘ ‘);        }        System.out.println();        return;    }    // 判斷arr數組是否有序    public static boolean isSorted(Comparable[] arr) {        for (int i = 0; i < arr.length - 1; i++)            if (arr[i].compareTo(arr[i + 1]) > 0)                return false;        return true;    }    // 測試sortClassName所對應的排序演算法排序arr數組所得到結果的正確性和演算法已耗用時間    public static void testSort(String sortClassName, Comparable[] arr) {        // 通過Java的反射機制,通過排序的類名,運行排序函數        try {            // 通過sortClassName獲得排序函數的Class對象            Class sortClass = Class.forName(sortClassName);            // 通過排序函數的Class對象獲得排序方法            Method sortMethod = sortClass.getMethod("sort", new Class[]{Comparable[].class});            // 排序參數只有一個,是可比較數組arr            Object[] params = new Object[]{arr};            long startTime = System.currentTimeMillis();            // 調用排序函數            sortMethod.invoke(null, params);            long endTime = System.currentTimeMillis();            assert isSorted(arr);            System.out.println(sortClass.getSimpleName() + " : " + (endTime - startTime) + "ms");        } catch (Exception e) {            e.printStackTrace();        }    }}

  

 

隨機化快速排序法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.