書接上回,我們繼續介紹排序演算法。
筆者的程式設計環境:
語言: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,比較...
從零開始學貪心演算法
貪心演算法的定義 貪心演算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有...