java 实现 常见排序算法(三)快速排序
大家好,我是烤鴨:????
???今天分享一下基礎(chǔ)排序算法之快速排序??焖倥判蚴莾?nèi)部排序(基于比較排序)中最好的比較算法。
?
1.?????快速排序:
原理:在要排的數(shù)(比如數(shù)組A)中選擇一個中心值key(比如A[0]),通過一趟排序?qū)?shù)組A分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然后對這兩部分分別重復(fù)這個過程,直到整個有序。
????????整個快排的過程就簡化為了一趟排序的過程,然后遞歸調(diào)用就行了。
思路:
1,定義i=0,j=A.lenght-1,i為第一個數(shù)的下標(biāo),j為最后一個數(shù)下標(biāo)
2,從數(shù)組的最后一個數(shù)Aj從右往左找,找到第一小于key的數(shù),記為Aj;
3,從數(shù)組的第一個數(shù)Ai 從左往右找,找到第一個大于key的數(shù),記為Ai;
4,交換Ai 和Aj?
5,重復(fù)這個過程,直到 i=j
6,調(diào)整key的位置,把A[i] 和key交換
代碼實(shí)現(xiàn):
public void quickSort(int[] numbers, int start, int end) {if (start < end) {int base = numbers[start]; // 選定的基準(zhǔn)值(第一個數(shù)值作為基準(zhǔn)值)int temp; // 記錄臨時(shí)中間值int i = start, j = end;do {while ((numbers[i] < base) && (i < end)) {i++;}while ((numbers[j] > base) && (j > start)) {j--;}if (i <= j) {temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;i++;j--;}} while (i <= j);if (start < j) {quickSort(numbers, start, j);}if (end > i) {quickSort(numbers, i, end);}}}耗時(shí)對比:
10W 條隨機(jī) 數(shù)據(jù) 運(yùn)行如圖:
分別對比了冒泡排序,直插排序,希爾排序和快速排序。差距很明顯。
50W 條隨機(jī) 數(shù)據(jù) 運(yùn)行如圖:
分別對比了冒泡排序,直插排序,希爾排序和快速排序。差距很明顯。
100W 條隨機(jī) 數(shù)據(jù) 運(yùn)行如圖:
分別對比了冒泡排序,直插排序,希爾排序和快速排序。差距很明顯。
總結(jié):
快速排序(Quicksort)是對冒泡排序的一種改進(jìn)。
最壞時(shí)間復(fù)雜度和插入排序相同:O(n^2)。
冒泡排序總的平均時(shí)間復(fù)雜度為:O(nlog2n)?。
各種排序方法比較:
?
更多排序算法:
冒泡排序? ?:??https://blog.csdn.net/Angry_Mills/article/details/81057900
插入排序? ?:??https://blog.csdn.net/Angry_Mills/article/details/81208700
總結(jié)
以上是生活随笔為你收集整理的java 实现 常见排序算法(三)快速排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springcloud gateway
- 下一篇: 什么是链表