學(xué)習(xí)筆記C++(冒泡排序、選擇排序、堆排序、遞歸)

冒泡排序法:就是兩兩交換到最后

冒泡排序法

重復(fù)執(zhí)行n次冒泡,也就是?O(n^2)。 空間復(fù)雜度是O(n)。


選擇排序法:

選擇排序法

這樣的過程要執(zhí)行n次,所以時(shí)間復(fù)雜度還是O(n^2)??臻g復(fù)雜度是O(n)


堆排序:

1、概念

堆排序就是把最大堆堆頂?shù)淖畲髷?shù)取出,將剩余的堆繼續(xù)調(diào)整為最大堆,再次將堆頂?shù)淖畲髷?shù)取出,這個(gè)過程持續(xù)到剩余數(shù)只有一個(gè)時(shí)結(jié)束。

堆排序的時(shí)間復(fù)雜度是O(nlgN),與快速排序達(dá)到相同的時(shí)間復(fù)雜度。但是在實(shí)際應(yīng)用中,我們往往采用快速排序而不是堆排序。這是因?yàn)榭焖倥判虻囊粋€(gè)好的實(shí)現(xiàn),往往比堆排序具有更好的表現(xiàn)。堆排序的主要用途,是在形成和處理優(yōu)先級(jí)隊(duì)列方面。另外,如果計(jì)算要求是類優(yōu)先級(jí)隊(duì)列(比如,只要返回最大或者最小元素,只有有限的插入要求等),堆同樣是很適合的數(shù)據(jù)結(jié)構(gòu)。

2、基礎(chǔ)知識(shí)

堆一般用數(shù)組表示,比如數(shù)組A數(shù)組的長度Length(A),堆在數(shù)組中的元素個(gè)數(shù)HeapSize(A)。一般說來,HeapSize(A) <= Length(A),因?yàn)閿?shù)組A當(dāng)中可能有一些元素不在堆中。

假設(shè)節(jié)點(diǎn)I是數(shù)組A中下標(biāo)為i的節(jié)點(diǎn)。

Parent(i) : return Floor(i/2); //I的父節(jié)點(diǎn)下標(biāo),F(xiàn)loor(i)表示比i小的最大整數(shù)。

Left(i) : return 2*i; //I的左子節(jié)點(diǎn)

Right(i) : return 2*i+1; //I的右子節(jié)點(diǎn)

含有n個(gè)元素的堆A的高度是: Floor(lgn)。

3、在堆中定義以下幾種操作:

最大堆調(diào)整(Max-Heapify):將堆的末端子節(jié)點(diǎn)作調(diào)整,使得子節(jié)點(diǎn)永遠(yuǎn)小于父節(jié)點(diǎn)

創(chuàng)建最大堆(Build-Max-Heap):將堆所有數(shù)據(jù)重新排序,使其成為最大堆

堆排序(Heap-Sort):移除位在第一個(gè)數(shù)據(jù)的根節(jié)點(diǎn),并做最大堆調(diào)整的遞歸運(yùn)算

思路參考如下圖

處理過程
思路

C++代碼參考

Java代碼參考


C++技術(shù)崗位-筆試面試題總結(jié)

遞歸:參考

特點(diǎn)1?它有一個(gè)基本部分,即直接滿足條件,輸出

?特點(diǎn)2?它有一個(gè)遞歸部分,即 通過改變基數(shù)(即n),來逐步使得n滿足基本部分的條件,從而輸出

?例子1: 全排列

? ? ? ?描述: 有n個(gè)數(shù)時(shí), 輸出n個(gè)數(shù)的所有排列組合

? ? ? ?分析: ?

假設(shè)有 abc三個(gè)數(shù),

? ? ? ? ? 特點(diǎn)3: 整體分割為局部,從基本部分開始輸出

? ? ? ? ? ? ?那么其輸出為 abc, acb, ? ? ?bac, bca, ? ? cba, cab。?

abc, bac, cba 三種情況下,都會(huì)從整體過度到 部分, 即 abc->bc, ? bac->ac, cba->ba, 而相應(yīng)的 bc, ac, ba, ?又會(huì)有cb, ca, ab的情況.即 perm(abc)-> ?a*perm(bc)+b*perm(ac)+c*perm(ba) ?。╬erm為排列的意思)

? ? ? ? ?特點(diǎn)1:

? ? ? ? ? ? 當(dāng)perm(bc)->b*perm(c)時(shí),即perm的數(shù)目只有一個(gè)時(shí),即為輸出

? ? ? ? ?特點(diǎn)2:

? ? ? ? ? ? perm(abc)->perm(bc)->perm(c)即 perm的數(shù)目遞減的過程,為遞歸部分

? ? ? ? ?特點(diǎn)4: 將遞歸的操作作為自操作,完成當(dāng)前整體的操作

? ? ? ? ? 一次,在一次整體的操作中, 需要abc, ?bac, cba三個(gè),進(jìn)行整體到部分的操作(即遞歸操作)。 ?

? ? ? ? ? ?而abc, bac, cba 是a 與 b, 與c交換的結(jié)果,因此,答案就出來了:

//Implementation?Permutation?n?numbers??

//交換位置??

template??

void?swap(T?&a,?T?&b)??

{??

????T?temp?=?a;??

????a?=?b;??

????b?=?temp;??

}??

//全排列,??

//list為排列的數(shù)的數(shù)組,如{1,?2,?3}???

//int?k?為排列數(shù)組的起始點(diǎn),int?m?為排列數(shù)組的終點(diǎn)??

//如k=0,m=2??將1,2,3進(jìn)行全排列,當(dāng)?k=1,??m=2,將2,3全排列??

template??

void?permulateNumber(T?list[],?int?k,?int?m)??

{??

if?(k?==?m)?//輸出條件,整體變部分,k?逐漸逼近?m直到=m??

????{??

//特點(diǎn)1?基本部分,?完成數(shù)組從第一個(gè)到最后一個(gè)數(shù)的輸出??

for?(int?i?=?0;?i?<=?m;?++i)??

????????{??

????????????std::cout?<<?list[i];??

????????}??

????????std::cout?<<?std::endl;??

????}??

else{//特點(diǎn)2?遞歸部分??


//以下為特點(diǎn)4??

for?(int?i?=?k;?i?<=?m;?++i)??

????????{??


swap(list[k],?list[i]);//?完成當(dāng)前排列部分中,第一個(gè)數(shù),與后面數(shù)的交換??

permulateNumber(list,?k?+?1,?m);//特點(diǎn)3?整體到部分??

????????????swap(list[i],?list[k]);???

????????}??

????}??

}??

PS:遞歸算法可以理解為一種思想,還有一切其他例子的應(yīng)用可以參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,822評(píng)論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,348評(píng)論 0 2
  • 四月的時(shí)候我們相遇 我認(rèn)定你就是我在人間的四月天 只是花沒開,人沒笑 只有海風(fēng)在微微的吹 帶著濃濃的海腥味 返回到...
    帷孇閱讀 239評(píng)論 0 1
  • 想象之中 一道彩虹 劃過天空 墜入草叢
    兮兮兮丶閱讀 284評(píng)論 0 1
  • 沒錢把事做好,你會(huì)變得有錢 有錢把人做好,你會(huì)更加有錢 年輕沒錢都很正常 因?yàn)槲覀儾皇歉欢?年老沒錢也很正常 因...
    猴爸陪你讀書閱讀 1,521評(píng)論 0 1

友情鏈接更多精彩內(nèi)容