快排的迭代,遞迴實現及其優化

2021-10-09 10:42:46 字數 2070 閱讀 1908

首先快排是一種比較排序

具體思想是 選出乙個基準值,通過比較找出待排序區間中基準值該放置的位置。

實現邏輯

通常有三種方式來進行基準數的左右分區

左右指標法。

挖坑法前後指標法。

左右指標實現:

//左右指標法

intpartsort

(int

* a,

int begin,

int end)

while

(begin < end && a[end]

>= key)

swap

(a[begin]

, a[end]);

}swap

(a[begin]

, a[index]);

return begin;

}

挖坑法實現:

//挖坑法

intpartsort2

(int

* a,

int begin,

int end)

a[end]

= a[begin]

;while

(a[begin]

< a[end]

&& a[end]

>= key)

a[begin]

= a[end];}

a[begin]

= key;

return begin;

}

前後指標法實現:

//前後指標法 思路cur一直向前走遇到小的就置換到前面 這樣一來 一次迴圈 就達到目的

intpartsort3

(int

* a,

int begin,

int end)

++cur;

}++prev;

swap

(a[prev]

, a[end]);

return prev;

}

遞迴:

void

quicksort

(int

* a,

int begin,

int end)

int mid =

partsort

(a, begin, end)

;//也可以寫進函式內部

quicksort

(a, begin, mid-1)

;quicksort

(a, mid+

1, end)

;}

迭代:

void

quickofstack

(int

* a,

int n)

if(mid+

1< end)

}}

空間複雜度,主要是遞迴造成的棧空間的使用,最好情況,遞迴樹的深度不深

其空間複雜度也就為 o(logn),

最壞情況,

需要進行n‐1遞迴呼叫,其空間複雜度為o(n),

平均情況,

空間複雜度也為o(logn)。

快排的平均時間複雜度是o(nlogn), 但是最壞的情況下,也就是有序的情況下回達到n^2的複雜度,因此我們考慮快排進行優化。為了避免有序情況下每次都取到最大值或者最小值。因此提出了三數取中的方法。

int

selectmid

(int

* a,

int begin,

int end)

else

if(a[mid]

>= a[begin]

&& a[begin]

>= a[end]

)return end;

}

穩定性: 快排是一種不穩定的演算法。

時間複雜度:o(nlogn)

空間複雜度:o(logn)

手寫快排 遞迴實現 棧迭代實現

快排思想 選取乙個記錄作為樞軸,經過一趟排序,將整段序列分為兩個部分,其中一部分的值都小於樞軸,另一部分都大於樞軸。然後繼續對這兩部分繼續進行排序,從而使整個序列達到有序。實現 演算法 1.選取乙個中樞key,2.將陣列,小於key的放左邊,大於key的放右邊 3.最後將key放到這個分成2組的中間...

快排非遞迴實現

int partition int arr,int low,int high arr low pivot return low void non recursive qsort int arr,int low,int high if high pivot 1 其實就是用棧儲存每乙個待排序子串的首尾元...

快速排序(快排 遞迴實現)

時間複雜度 o nlogn 注意 1 時間複雜度與pivot的選取有關,最好能選到正中間 2 該排序不是穩定排序 1.0 不用swap函式 相較2.0節省時間 int qsort int l,int r s l pivot return l 2.0 用swap函式int qsort int l,in...