快速排序的思想
快速是這個演算法的特點,所以為了效率出現頻度也會很高。快速排序:基準元素+二分思想,分治的標準是相比於基準元素值的大小(比如相比於基準元素大的放右邊,小的放左邊),分治思想的執行提高了執行效率。
快速排序**
public
class
quicksort ;
//實現排序的方法
quicksort(sum,0,sum.length-1);
//迴圈輸出
for (int i: sum)
}/**
* 分治方法的遞迴實現
*@param attr 需要排序的陣列
*@param left 最左邊元素下標
*@param right 最右邊元素下標
*/public
static
void
quicksort(int attr, int left, int right)
/*** 歸位基本元素,返回劃分元素的位置
*@param attr 劃分的陣列
*@param left 最左元素下標
*@param right 最右元素下標
*@return 返回歸位的位置
*/public
static
intpartition(int attr, int left, int right)
}//待比較元素不大於2,即兩元素比較的位置相遇了,置換基準元素到相遇的位置,完成歸位
attr[left] = attr[j];
attr[j] = sign;
//返回歸位的位置
return j;
}}
快速排序的時間複雜度
1.快速排序每次將待排序陣列二分為兩個部分,在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。
2.在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o(nlogn),最壞情況為o(n^2)。
3.在實際應用中,快速排序的平均時間複雜度為o(nlogn)。優於氣泡排序,在各大演算法中算是時間較小的。
快速排序的穩定性
在基準元素和a[j]交換的時候,很有可能把前面的元素的穩定性打亂,比如序列5 3 3 4 3 8 9 10 11,現在中樞元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是乙個不穩定的排序演算法。
總結
可以看到,快速排序的**量與氣泡排序相比,龐大了不少,思路就是不斷的實現二分和歸位目標元素,來完成整個排序演算法,遞迴的使用讓我們不必再擔心迴圈的次數了。
挖坑排序
挖坑排序也算是快速排序,相比快速排序,**量縮減很多。挖坑排序的思想也是分治+遞迴+基準元素歸位實現的,但是挖坑是順序填補元素的,也就是目標元素順序填補從所給資料倒序符合的元素,反過來同理倒序填補所給元素順序查詢符合的元素。可以看到**量也是比較簡短的。
挖坑排序**
public
class
quick ;
//實現排序的方法
quick_sort(sum,0,sum.length-1);
//迴圈輸出
for (int i: sum)
}/**
*@param s 目標陣列
*@param l 要排序陣列最左元素下標
*@param r 要排序陣列最右元素下標
*/static
void quick_sort(int attr, int l, int r)
//基準元素歸位
attr[i] = sign;
quick_sort(attr, l, i - 1); // 遞迴呼叫
quick_sort(attr, i + 1, r);
} }
}
詳細**介紹請參考大神博文: 基準數 快速排序
問題 對 6 1 2 7 9 3 4 5 10 8 十個數進行排序 首先選乙個基準數,為了方便,我們就選第乙個數6作為準基數吧。我們想把準基數6放到它準確的位置,就是排序好後的位置 我們想把比6小的都放在6的左邊,比6大的都放在6的右邊,那麼6的位置就排序好了 我們假設序列兩端都有乙個箭頭,乙個從左...
排序(三) 快速排序 選取不同位置基準數
1 i l j r 將基準數挖出形成第乙個坑a i 2 j 由後向前找比它小的數,找到後挖出此數填前乙個坑a i 中。3 i 由前向後找比它大的數,找到後也挖出此數填到前乙個坑a j 中。4 再重複執行2,3二步,直到i j,將基準數填入a i 中。include include using nam...
04 第四章 快速排序(分而治之)
本章內容 目錄 分而治之 快速排序 再談大o表示法 分而治之並非可用於解決問題的演算法,而是一種解決思路。使用分而治之策略解決問題的過程包括兩個步驟 找出基線條件,這種條件必須盡可能簡單。不斷將問題分解 或者說是減小規模 直到符合基線條件 例項一 比如編寫求解乙個數字陣列之和的函式 第一步,找到基線...