快速排序 分治演算法

2021-10-07 15:33:46 字數 2526 閱讀 6962

基於分治策略的排序在快速排序中,記錄的比較和交換是從兩端向中間進行的,關鍵字較大(小)的記錄一次就能交換到後(前)面單元,總的比較和移動次數較少

基本思想:對於輸入子陣列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的前面,最後的結果是將原始序列分為兩個子串行,而...