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 思路 快速排序的基本思想是在數列中找出適當的軸心,將數列分成左右兩部分 左半部分的元素都小於右半部分的元素 然後分別對兩部分進行排序 重複選擇軸心,劃分左右部分的過程 ...