演算法與資料結構 6 快速排序

2021-09-26 22:11:08 字數 2450 閱讀 4289

下面舉個例子來說明快速排序的思想。如下圖所示,給出無序的一組序列。

對於第乙個元素4,快速排序的目的是將元素4放入合適的位置,使得4前面的元素都小於4,4後面的元素都大於4。

接下來,分別對4前面的元素和4後面的元素進行快速排序,使用遞迴即可完成操作。

而快速排序的核心(難點)就是如何將乙個元素放入合適的位置。這裡這個核心過程稱之為partition(分割)

如下圖所示,使用序列中的第乙個元素l作為基準,基準用v表示,進行比較之後,這個基準v將遍歷整個序列。在比較的過程中,一部分元素小於v,另一部分元素大於v。 使用 j 表示分界點,e 表示當前訪問的元素。

v 表示基準,一般從第乙個元素開始

l 表示第乙個元素的索引

j 表示大於v 和 小於v 的分界點的索引

i 表示當前訪問的元素的索引

由下圖我們可知

區間 arr[l+1, j] < v

區間 arr[j+1, i-1] > v

下面將看一下當前索引i是如何放入合適的位置的

假設i索引位置e>v,那麼直接將e放入》v區間內

如下圖所示,假設 i 索引位置 e

接著i往後移動一位,在考察下乙個元素,以此類推…

此時整個序列分為3個部分,現在只需要將v和j索引位置元素進行交換即可。

後面使用遞迴即可完成所有的快速排序。

快速排序演算法複雜度 o(n

log⁡(n

))o\left( \right)

o(nlog(n

))**示例

#include

using

namespace std;

template

<

typename t>

//對arr[l,r]部分進行partition操作//

//返回p, 使得arr[l,p-1]arr[p]//

int__partition

(t arr,

int l,

int r)

}swap

(arr[l]

, arr[j]);

return j;

}template

<

typename t>

// 對arr[l,r]部分進行快速排序//

void

__quicksort

(t arr,

int l,

int r)

template

<

typename t>

//使用快速排序 讓陣列中的數字從小到大排序 //

void

quicksort

(t arr,

int n)

intmain()

;quicksort

(a,10);

for(

int i =

0; i <

10; i++

) cout << a[i]

<<

" ";

cout << endl;

cin.

get();

return0;

}

執行結果[1] 演算法與資料結構–綜合提公升篇(c++版)

[2]

[3]

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法 快速排序

基礎概念 快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊 扔 以從小到大排序為例,比它小的都 扔 到它的左邊,比它大的都 扔 到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都...

資料結構與演算法 快速排序

快速排序在實際應用中使用廣泛,效果也高。快排使用的是分治策略,一組序列基於某乙個基準值分成兩個大小的子串行,遞迴排序子串行,最終得到有序的序列。快排的平均時間複雜度為o nlogn 演算法的實現步驟 1.在序列中挑選乙個基準值,我們可以預設第乙個數為基準值 2.從兩邊的數值跟基準值作對比,數值小的放...