基於分治策略的排序在快速排序中,記錄的比較和交換是從兩端向中間進行的
,關鍵字較大(小)的記錄一次就能交換到後(前)面單元,總的比較和移動次數較少
。
基本思想:對於輸入子陣列a[p: r]
分解:
以a[p]為基準元素
將a[p: r]劃分成三段a[p: q-1], a[q] 和a[q+1:r], 使得a[p: q-1]中任一元素<= a[q], a[q+1:r]中任一元素》= a[q]. q在劃分過程中確定.
遞迴求解
: 分別對a[p: q-1]和a[q+1:r]進行遞迴排序.
合併
: 將排好序的a[p: q-1]和a[q+1:r]直接合併, 即得a[p: r].
}上述的partition (type a, int p, int r)適用於指定了某個基準元素
,然後以該基準元素進行比較另一種partition(),其實思想差不多
int partition (
int arr,
int start_,
int end_)
arr[end_]
=value;
return end_;
}
平均時間複雜度
? 可參考分治的基本複雜度分析
最壞時間複雜度
在最壞的情況下,待排序的序列為逆序,每次劃分產生的兩個區域分別包含(n-1)
個元素和1
個元素。如果遞迴樹畫出來,它就是一棵斜樹。此時需要執行(n‐1次)
遞迴呼叫,且第i次劃分需要經過(n‐i)次關鍵字的比較
才能找到第i個記錄,也就是基準元素的位置,因此比較次數為
? 如果想研究隨機選擇策略,可以看一下線性時間選擇問題的基本求解
#include
using namespace std;
int partition (
int arr,
int start_,
int end_)
;//先進行快排,將我們的陣列進行排序,再進行二分搜尋
void
quicksort
(int arr,
int startv,
int endv)
}//獲取中間的數
int partition (
int arr,
int start_,
int end_)
arr[end_]
=value;
return end_;
}int
main()
quicksort
(arr,
0,len-1)
; cout<<
"排序後的陣列: "
;for
(int i=
0;i)}
輸入請輸入長度:10
請輸入數字:2 8 9 4 3 50 10 66 0 8
刪除
排序後的陣列: 0 2 3 4 8 8 9 10 50 66
分治演算法 快速排序
一.演算法思想 假設要對某陣列進行由小 大排序 1 分解 對於亂序陣列a r 訪問範圍 0 r 有r 1個數 取乙個基準元素a p 一般以第乙個數即a 0 為基準 確定某個partition 位置 q 使a q 右邊的數都大於等於a p a q 左邊的數都小於等於a p 2 遞迴分治 分解之後,陣列...
排序演算法 快速排序(分治法)
思想 快速排序採用的思想是分治思想。快速排序是找出乙個元素 理論上可以隨便找乙個 作為基準 pivot 然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值 都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n 1個元素也調整到排序後的正確位置。最...
分治演算法之快速排序
快速排序演算法也是基於分治思想的一種排序演算法,它的基本操作即為比較 交換。快速排序演算法的基本思想是從待排序的序列中選取乙個比較標準k 通常選取第乙個元素 然後將其餘元素依次跟k進行比較。在比較的過程中將大於k的元素移到k的後面,將小於k的元素移到k的前面,最後的結果是將原始序列分為兩個子串行,而...