Java演算法之經典快速排序和隨機快速排序

2021-08-22 06:11:31 字數 1850 閱讀 2455

package cn.itcats.sort;

import org.junit.test;

/** * (r)歸類快速排序,每次取陣列最後乙個數進行比較歸類

* @author fatah

*/public class quicksort

quicksort(arr,0,arr.length-1);

} public void quicksort(int arr, int l, int r)

} public int partition(int arr, int l, int r)

else if(arr[l] >arr[r]) else

} //交換最後乙個數字,把最後比較的x值和more的第乙個位置(被排好序的x)放到一起

//小於x =x 大於x

swap(arr,more,r);

return new int ;

} private void swap(int arr, int i, int j)

@test

public void flagtest() ;

quicksort(arr, 0, arr.length - 1);

for (int i : arr)

}}

經典快排 時間複雜度o(n²),每次排序只解決乙個數字的排序。(小於區域和大於區域規模不均),和資料狀況有關係。

如陣列arr為,使用最後乙個數6進行劃分,此時只有<6的區域和等於6的區域,partition一遍後,只搞定乙個數6,代價為o(n),接下來又使用5去比較劃分,也只搞定了乙個數5...一共有n個數,每個數都需要o(n),則總共為o(n²)。

使用隨機快速排序和經典快排不同,經典快排序每次取陣列最後乙個數進行比較歸類,而隨機快排是每次從陣列中隨機取乙個數,放在陣列末尾索引,進行排序,後續步驟同經典快排,只是取值比較的值是隨機取的,那麼無論最好還是最壞情況它都是乙個概率事件,在大樣本環境下,經過概率學證明後可以得到隨機快排時間複雜度可以達到o(n*logn)。

package cn.itcats.sort;

import org.junit.test;

public class randomquicksort

randomquicksort(arr,0,arr.length-1);

} public void randomquicksort(int arr, int l, int r) else

} swap(arr,r,more);

return new int ;

} public void swap(int arr, int l, int r)

@test

public void flagtest() ;

randomquicksort(arr);

for (int i : arr)

}}

經典快速排序過渡到隨機快速排序,時間複雜度由o(n²)下降到了o(n * logn)。其實在演算法裡面,規避樣本量對時間複雜度的影響有兩種做法,除了產生隨機數的方式外,還可以使用hash

隨機快速排序時間複雜度o(n*logn),額外空間複雜度o(logn),大樣本期望的額外空間複雜度是o(logn),最差情況的額外空間複雜度是o(n)

補充:為什麼隨機快排額外空間複雜度為o(logn)呢?

如int  arr = ,我們需要使用partition記錄斷點位置,斷點如果都打在中間,則8條資料只需要記錄3次斷點即可,這為最好情況,但如果斷點打在7,第二次打在6,第三次打在5...則8條資料,一共需要記錄8次斷點,這就為最差情況。

經典排序演算法之快速排序

快排的思想是遞迴。一趟下來,比基數小的都在基數的左邊,比基數大的都在基數的右邊,然後分別對基數左邊的數進行遞迴,對右邊的數進行遞迴 當需要遞迴的元素只有乙個時,結束遞迴。public class quicksort quicksort arr,0,arr.length 1 for int a arr...

經典排序演算法之快速排序

快速排序就是通過一趟排序將原資料分成兩部分,其中一部分關鍵字都比另一部分小,接下來再對這兩部分分別使用快速排序,這裡有遞迴的思想。快速排序的平均時間複雜度為o nlgn 所以適合資料量較大的情況,但快排需要頻繁的對資料位置的操作,故不適合鏈式儲存資料。function sortquick arr,s...

經典演算法之快速排序

說明 快速排序是目前公認最快的排序方法之一。大部分情況都表現得很好,但當必須考慮最壞情況時,快速排序不可接受,因為時間達到o n2 思路 快速排序的基本思想是在數列中找出適當的軸心,將數列分成左右兩部分 左半部分的元素都小於右半部分的元素 然後分別對兩部分進行排序 重複選擇軸心,劃分左右部分的過程 ...