從零開使學演算法 排序演算法

2021-10-06 23:15:53 字數 2335 閱讀 6359

書接上回,我們繼續介紹排序演算法。

筆者的程式設計環境:

語言:c++

編譯器: code blocks

系統環境:window 10 x64

基本思想

在待排序陣列中任選乙個元素作為樞軸pivot(也有叫基準base的)

一趟排序使得元素組劃分成兩部分,一部分元素均大於樞軸,一部分均小於樞軸。

對劃分後的兩部分繼續執行第一步與第二部,至序列有序

空間複雜度:o(logn)

時間複雜度:o(nlogn)

穩定性:不穩定

**如下:

template

<

typename t>

intpartition

(t arr,

int low,

int high)

//劃分

arr[low]

=index;

return low;

}template

<

typename t>

intquicksort

(t arr,

int low,

int high)

//排序

return0;

}template

<

typename t>

intsort

(t arr,

int count)

//排序入口

基本思想將待排序序列構建成堆(以大根堆為例)

將對頂元素與堆中最後乙個元素交換,並將最後乙個元素脫離堆

對剩下的元素進行堆調整,使其依然是大根堆。

重複執行2,3步至堆消失

空間複雜度:o(1)

時間複雜度:o(nlogn)

穩定性:不穩定

**如下:

template

<

typename t>

intswap

(t &a,t &b)

//交換函式

template

<

typename t>

intbuildheap

(t arr,

int count)

//建堆函式

return0;

}template

<

typename t>

intheapadjust

(t arr,

int count,

int begin)

//堆調整函式

} arr[begin]

=index;

return0;

}template

<

typename t>

intsort

(t arr,

int count)

//堆排序

return0;

}

基本思想將待排序序列劃分成n個組

將得到的組兩兩合併得到一定數量的有序組

重複執行第二步至僅剩乙個有序組

示意圖如下:

空間複雜度:o(n)

時間複雜度:o(nlogn)

穩定性:穩定

**如下:

template

<

typename t>

intmerge

(t arr,

int low,

int mid,

int high)

//合併

template

<

typename t>

intmergesort

(t arr,

int low,

int high)

//劃分與排序

return0;

}template

<

typename t>

intsort

(t arr,

int count)

//排序入口

從零開書學演算法(導論)之歸併排序

歸併排序思想為將序列每相鄰兩個數字進行歸併操作 merge 形成floor n 2 個序列,排序後每個序列包含兩個元素將上述序列再次歸併,形成floor n 4 個序列,每個序列包含四個元素重複步驟2,直到所有元素排序完畢。下列 為單次歸併的函式,可作為模板用於 中。ps 其中前段為第p位到第q位,...

菜鳥學演算法 選擇排序

例如有一樣本 3,6,8,9,5,4,7,1,2,0 使用選擇排序從小到大排序過程如下 樣本 3,6,8,9,5,4,7,1,2,0 有序集合 第一次選擇 最小值 3,比較值 6,3 6,最小值 3,比較值 8,3 8,最小值 3,比較值 9,3 9,最小值 3,比較值 5,3 5,最小值 3,比較...

從零開始學貪心演算法

貪心演算法的定義 貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有...