非常實用的數(shù)據(jù)結(jié)構(gòu)知識點總結(jié)_第1頁
非常實用的數(shù)據(jù)結(jié)構(gòu)知識點總結(jié)_第2頁
非常實用的數(shù)據(jù)結(jié)構(gòu)知識點總結(jié)_第3頁
非常實用的數(shù)據(jù)結(jié)構(gòu)知識點總結(jié)_第4頁
非常實用的數(shù)據(jù)結(jié)構(gòu)知識點總結(jié)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、數(shù)據(jù)結(jié)構(gòu)知識點概括第一章 概 論數(shù)據(jù)就是指能夠被計算機(jī)識別、存儲和加工處理的信息的載體。數(shù)據(jù)元素是數(shù)據(jù)的根本單位,可以由假設(shè)干個數(shù)據(jù)項組成。數(shù)據(jù)項是具有獨立含義的最小標(biāo)識單位。數(shù)據(jù)結(jié)構(gòu)的定義:邏輯結(jié)構(gòu):從邏輯結(jié)構(gòu)上描述數(shù)據(jù),獨立于計算機(jī)。線性結(jié)構(gòu):一對一關(guān)系。線性結(jié)構(gòu):多對多關(guān)系。存儲結(jié)構(gòu):是邏輯結(jié)構(gòu)用計算機(jī)語言的實現(xiàn)。順序存儲結(jié)構(gòu):如數(shù)組。鏈?zhǔn)酱鎯Y(jié)構(gòu):如鏈表。索引存儲結(jié)構(gòu):稠密索引:每個結(jié)點都有索引項。稀疏索引:每組結(jié)點都有索引項。散列存儲結(jié)構(gòu):如散列表。數(shù)據(jù)運算。對數(shù)據(jù)的操作。定義在邏輯結(jié)構(gòu)上,每種邏輯結(jié)構(gòu)都有一個運算集合。常用的有:檢索、插入、刪除、更新、排序。數(shù)據(jù)類型:是一個值的集合

2、以及在這些值上定義的一組操作的總稱。結(jié)構(gòu)類型:由用戶借助于描述機(jī)制定義,是導(dǎo)出類型。 抽象數(shù)據(jù)類型ADT:是抽象數(shù)據(jù)的組織和與之的操作。相當(dāng)于在概念層上描述問題。 優(yōu)點是將數(shù)據(jù)和操作封裝在一起實現(xiàn)了信息隱藏。程序設(shè)計的實質(zhì)是對實際問題選擇一種好的數(shù)據(jù)結(jié)構(gòu),設(shè)計一個好的算法。算法取決于數(shù)據(jù)結(jié)構(gòu)。算法是一個良定義的計算過程,以一個或多個值輸入,并以一個或多個值輸出。評價算法的好壞的因素:算法是正確的;執(zhí)行算法的時間;執(zhí)行算法的存儲空間主要是輔助存儲空間;算法易于理解、編碼、調(diào)試。時間復(fù)雜度:是某個算法的時間消耗,它是該算法所求解問題規(guī)模n的函數(shù)。漸近時間復(fù)雜度:是指當(dāng)問題規(guī)模趨向無窮大時,該算法時

3、間復(fù)雜度的數(shù)量級。評價一個算法的時間性能時,主要標(biāo)準(zhǔn)就是算法的漸近時間復(fù)雜度。算法中語句的頻度不僅與問題規(guī)模有關(guān),還與輸入實例中各元素的取值相關(guān)。時間復(fù)雜度按數(shù)量級遞增排列依次為:常數(shù)階O1、對數(shù)階Olog2n、線性階On、線性對數(shù)階Onlog2n、平方階On2、立方階On3、k次方階Onk、指數(shù)階O2n??臻g復(fù)雜度:是某個算法的空間消耗,它是該算法所求解問題規(guī)模n的函數(shù)。算法的時間復(fù)雜度和空間復(fù)雜度合稱算法復(fù)雜度。第二章 線性表線性表是由n0個數(shù)據(jù)元素組成的有限序列。n=0是空表;非空表,只能有一個開始結(jié)點,有且只能有一個終端結(jié)點。線性表上定義的根本運算:構(gòu)造空表:InitlistL求表長:

4、ListlengthL取結(jié)點:GetNodeL,i查找:LocateNodeL,x插入:InsertListL,x,i刪除:DeleteL,i順序表是按線性表的邏輯結(jié)構(gòu)次序依次存放在一組地址連續(xù)的存儲單元中。在存儲單元中的各元素的物理位置和邏輯結(jié)構(gòu)中各結(jié)點相鄰關(guān)系是一致的。地址計算:LOCai=LOCa1+i-1*d;首地址為1在順序表中實現(xiàn)的根本運算:插入:平均移動結(jié)點次數(shù)為n/2;平均時間復(fù)雜度均為On。 刪除:平均移動結(jié)點次數(shù)為n-1/2;平均時間復(fù)雜度均為On。線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)中結(jié)點的邏輯次序和物理次序不一定相同,為了能正確表示結(jié)點間的邏輯關(guān)系,在存儲每個結(jié)點值的同時,還存儲了其后

5、繼結(jié)點的地址信息即指針或鏈。這兩局部信息組成鏈表中的結(jié)點結(jié)構(gòu)。 一個單鏈表由頭指針的名字來命名。單鏈表運算:建立單鏈表頭插法:s-next=head;head=s;生成的順序與輸入順序相反。平均時間復(fù)雜度均為On。尾插法:head=rear=null;ifhead=null head=s;else r-next=s;r=s; 平均時間復(fù)雜度均為On加頭結(jié)點的算法:對開始結(jié)點的操作無需特殊處理,統(tǒng)一了空表和非空表。查找按序號:與查找位置有關(guān),平均時間復(fù)雜度均為On。按值:與輸入實例有關(guān),平均時間復(fù)雜度均為On。插入運算:p=GetNodeL,i-1;s-next=p-next;p-next=s;

6、平均時間復(fù)雜度均為On刪除運算:p=GetNodeL,i-1;r=p-next;p-next=r-next;freer;平均時間復(fù)雜度均為On單循環(huán)鏈表是一種首尾相接的單鏈表,終端結(jié)點的指針域指向開始結(jié)點或頭結(jié)點。鏈表終止條件是以指針等于頭指針或尾指針。采用單循環(huán)鏈表在實用中多采用尾指針表示單循環(huán)鏈表。優(yōu)點是查找頭指針和尾指針的時間都是O1,不用遍歷整個鏈表。雙鏈表就是雙向鏈表,就是在單鏈表的每個結(jié)點里再增加一個指向其直接前趨的指針域prior,形成兩條不同方向的鏈。由頭指針head惟一確定。雙鏈表也可以頭尾相鏈接構(gòu)成雙向循環(huán)鏈表。雙鏈表上的插入和刪除時間復(fù)雜度均為O 1。順序表和鏈表的比擬:

7、基于空間: 順序表的存儲空間是靜態(tài)分配,存儲密度為1;適于線性表事先確定其大小時采用。鏈表的存儲空間是動態(tài)分配,存儲密度1;適于線性表長度變化大時采用?;跁r間:順序表是隨機(jī)存儲結(jié)構(gòu),當(dāng)線性表的操作主要是查找時,宜采用。以插入和刪除操作為主的線性表宜采用鏈表做存儲結(jié)構(gòu)。假設(shè)插入和刪除主要發(fā)生在表的首尾兩端,那么宜采用尾指針表示的單循環(huán)鏈表。第三章 棧和隊列棧Stack是僅限制在表的一端進(jìn)行插入和刪除運算的線性表,稱插入、刪除這一端為棧頂,另一端稱為棧底。表中無元素時為空棧。棧的修改是按后進(jìn)先出的原那么進(jìn)行的,我們又稱棧為LIFO表Last In First Out。通常棧有順序棧和鏈棧兩種存儲

8、結(jié)構(gòu)。棧的根本運算有六種: 構(gòu)造空棧:InitStackS判棧空: StackEmptyS判棧滿: StackFullS進(jìn)棧: PushS,x退棧: PopS取棧頂元素:StackTopS在順序棧中有“上溢和“下溢的現(xiàn)象。 “上溢是棧頂指針指出棧的外面是出錯狀態(tài)。“下溢可以表示棧為空棧,因此用來作為控制轉(zhuǎn)移的條件。順序棧中的根本操作有六種:構(gòu)造空棧 判棧空 判棧滿 進(jìn)棧 退棧 取棧頂元素鏈棧那么沒有上溢的限制,因此進(jìn)棧不要判棧滿。鏈棧不需要在頭部附加頭結(jié)點,只要有鏈表的頭指針就可以了。鏈棧中的根本操作有五種:構(gòu)造空棧 判???進(jìn)棧 退棧 取棧頂元素隊列Queue是一種運算受限的線性表,插入在表

9、的一端進(jìn)行,而刪除在表的另一端進(jìn)行,允許刪除的一端稱 為隊頭front,允許插入的一端稱為隊尾rear ,隊列的操作原那么是先進(jìn)先出的,又稱作FIFO表First In First Out .隊列也有順序存儲和鏈?zhǔn)酱鎯煞N存儲結(jié)構(gòu)。隊列的根本運算有六種:置空隊:InitQueueQ判隊空:QueueEmptyQ判隊滿:QueueFullQ入隊:EnQueueQ,x出隊:DeQueueQ取隊頭元素:QueueFrontQ順序隊列的“假上溢現(xiàn)象:由于頭尾指針不斷前移,超出向量空間。這時整個向量空間及隊列是空的卻產(chǎn)生了“上溢現(xiàn)象。為了克服“假上溢現(xiàn)象引入循環(huán)向量的概念,是把向量空間形成一個頭尾相接的

10、環(huán)形,這時隊列稱循環(huán)隊列。判定循環(huán)隊列是空還是滿,方法有三種: 一種是另設(shè)一個布爾變量來判斷;第二種是少用一個元素空間,入隊時先測試rear+1%m = front? 滿:空;第三種就是用一個計數(shù)器記錄隊列中的元素的總數(shù)。隊列的鏈?zhǔn)酱鎯Y(jié)構(gòu)稱為鏈隊列,一個鏈隊列就是一個操作受限的單鏈表。為了便于在表尾進(jìn)行插入入隊的 操作,在表尾增加一個尾指針,一個鏈隊列就由一個頭指針和一個尾指針唯一地確定。鏈隊列不存在隊滿和上溢的問題。在鏈隊列的出隊算法中,要注意當(dāng)原隊中只有一個結(jié)點時,出隊后要同進(jìn)修改頭尾指針并使隊列變空。 第四章 串串是零個或多個字符組成的有限序列。空串:是指長度為零的串,也就是串中不包含

11、任何字符結(jié)點??瞻状褐复邪粋€或多個空格字符的串。在一個串中任意個連續(xù)字符組成的子序列稱為該串的子串,包含子串的串就稱為主串。子串在主串中的序號就是指子串在主串中首次出現(xiàn)的位置??沾侨我獯淖哟我獯亲陨淼淖哟?。串分為兩種: 串常量在程序中只能引用不能改變;串變量的值可以改變。串的根本運算有: 求串長strlenchar*s串復(fù)制strcpychar*to,char*from串聯(lián)接strcatchar*to,char*from串比擬charcmpchar*s1,char*s2字符定位strchrchar*s,charc串是特殊的線性表結(jié)點是字符,所以串的存儲結(jié)構(gòu)與線性表的存儲結(jié)構(gòu)類

12、似。串的順序存儲結(jié)構(gòu)簡稱為順序串。順序串又可按存儲分配的不同分為: 靜態(tài)存儲分配:直接用定長的字符數(shù)組來定義。優(yōu)點是涉及串長的操作速度 快,但不適合插入、鏈接操作。動態(tài)存儲分配:是在定義串時不分配存儲空間,需要使用時按所需串的長度分配存儲單元。串的鏈?zhǔn)酱鎯褪怯脝捂湵淼姆绞酱鎯Υ?,串的這種鏈?zhǔn)酱鎯Y(jié)構(gòu)簡稱為鏈串。鏈串與單鏈表的差異只是它的 結(jié)點數(shù)據(jù)域為單個字符。為了解決“存儲密度低的狀況,可以讓一個結(jié)點存儲多個字符,即結(jié)點的大小。順序串上子串定位的運算:又稱串的“模式匹配或“串匹配,是在主串中查找出子串出現(xiàn)的位置。在串匹配中,將主串稱為目標(biāo)串,子串稱為模式串。這是比擬容易理解的,串匹配問題就

13、是找出給定模式串P在給定目標(biāo)串T中首次出現(xiàn)的有效位移或者是全部有效位移。最壞的情況下時間復(fù)雜度是On-m+1m,假設(shè)m與n同階的話那么它是On2。鏈串上的子串定位運算位移是結(jié)點地址而不是整數(shù)第五章 多維數(shù)組數(shù)組一般用順序存儲的方式表示。存儲的方式有: 行優(yōu)先順序,也就是把數(shù)組逐行依次排列。PASCAL、C 列優(yōu)先順序,就是把數(shù)組逐列依次排列。FORTRAN地址的計算方法: 按行優(yōu)先順序排列的數(shù)組:LOCaij=LOCa11+i-1*n+j-1*d. 按列優(yōu)先順序排列的數(shù)組:LOCaij=LOCa11+j-1*n+i-1*d.矩陣的壓縮存儲:為多個相同的非零元素分配一個存儲空間;對零元素不分配空

14、間。特殊矩陣的概念:所謂特殊矩陣是指非零元素或零元素分布有一定規(guī)律的矩陣。稀疏矩陣的概念:一個矩陣中假設(shè)其非零元素的個數(shù)遠(yuǎn)遠(yuǎn)小于零元素的個數(shù),那么該矩陣稱為稀疏矩陣。 特殊矩陣的類型: 對稱矩陣:滿足aij=aji。元素總數(shù)nn+1/2.I=maxi,j,J=mini,j,LOCaij=LOCsa0+I*I+1/2+J*d.三角矩陣: 上三角陣:k=i*2n-i+1/2+j-i,LOCaij=LOCsa0+k*d. 下三角陣:k=i*i+1/2+j,LOCaij=LOCsa0+k*d.對角矩陣:k=2i+j,LOCaij=LOCsa0+k*d.稀疏矩陣的壓縮存儲方式用三元組表把非零元素的值和它

15、所在的行號列號做為一個結(jié)點存放在一起,用這些結(jié)點組成的一個線性表來表示。但這種壓縮存儲方式將失去隨機(jī)存儲功能。參加行表記錄每行的非零元素在三元組表中的起始位置,即帶行表的三元組表。第六章 樹樹是n個結(jié)點的有限集合,非空時必須滿足:只有一個稱為根的結(jié)點;其余結(jié)點形成m個不相交的子集,并稱根的子樹。根是開始結(jié)點;結(jié)點的子樹數(shù)稱度;度為0的結(jié)點稱葉子終端結(jié)點;度不為0的結(jié)點稱分支結(jié)點非終端結(jié)點;除根外的分支結(jié)點稱內(nèi)部結(jié)點;有序樹是子樹有左,右之分的樹;無序樹是子樹沒有左,右之分的樹;森林是m個互不相交的樹的集合;樹的四種不同表示方法:樹形表示法;嵌套集合表示法;凹入表示法廣義表表示法。二叉樹的定義:

16、是n0個結(jié)點的有限集,它是空集n=0或由一個根結(jié)點及兩棵互不相交的分別稱作這個根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情形,與度數(shù)為2的有序樹不同。二叉樹的4個重要性質(zhì): 二叉樹上第i層上的結(jié)點數(shù)目最多為2i-1i1。;深度為k的二叉樹至多有2k-1個結(jié)點k1;在任意一棵二叉樹中,假設(shè)終端結(jié)點的個數(shù)為n0,度為2的結(jié)點數(shù)為n2,那么n0=n2+1;具有n個結(jié)點的完全二叉樹的深度為intlog2n+1.滿二叉樹是一棵深度為k,結(jié)點數(shù)為2k-1的二叉樹;完全二叉樹是滿二叉樹在最下層自右向左去處局部結(jié)點;二叉樹的順序存儲結(jié)構(gòu)就是把二叉樹的所有結(jié)點按照層次順序存儲到連續(xù)的存儲單元中。存儲前先

17、將其畫成完全二叉樹樹的存儲結(jié)構(gòu)多用的是鏈?zhǔn)酱鎯ΑinTNode的結(jié)構(gòu)為lchild|data|rchild,把所有BinTNode類型的結(jié)點,加上一個指向根結(jié)點的BinTree型頭指針就構(gòu)成了二叉樹的鏈?zhǔn)酱鎯Y(jié)構(gòu),稱為二叉鏈表。它就是由根指針root唯一確定的。共有2n個指針域,n+1個空指針。根據(jù)訪問結(jié)點的次序不同可得三種遍歷:先序遍歷前序遍歷或先根遍歷,中序遍歷或中根遍歷、后序遍歷或后根遍歷。時間復(fù)雜度為On。利用二叉鏈表中的n+1個空指針域來存放指向某種遍歷次序下的前趨結(jié)點和后繼結(jié)點的指針,這些附加的指針就稱為“線索,加上線索的二叉鏈表就稱為線索鏈表。線索使得查找中序前趨和中序后繼變得

18、簡單有效,但對于查找指定結(jié)點的前序前趨和后序后繼并沒有什么作用。樹和森林及二叉樹的轉(zhuǎn)換是唯一對應(yīng)的。轉(zhuǎn)換方法: 樹變二叉樹:兄弟相連,保存長子的連線。二叉樹變樹:結(jié)點的右孩子與其雙親連。森林變二叉樹:樹變二叉樹,各個樹的根相連。樹的存儲結(jié)構(gòu):有雙親鏈表表示法:結(jié)點data | parent,對于求指定結(jié)點的雙親或祖先十分方便,但不適于求指定結(jié)點的孩子及后代。孩子鏈表表示法:為樹中每個結(jié)點data | next設(shè)置一個孩子鏈表firstchild,并將data | firstchild存放在一個向量中。雙親孩子鏈表表示法:將雙親鏈表和孩子鏈表結(jié)合。孩子兄弟鏈表表示法:結(jié)點結(jié)構(gòu)leftmostch

19、ild |data | rightsibing,附加兩個分別指向該結(jié)點的最左孩子和右鄰兄弟的指針域。樹的前序遍歷與相對應(yīng)的二叉樹的前序遍歷一致;樹的后序遍歷與相對應(yīng)的二叉樹的中序遍歷一致。樹的帶權(quán)路徑長度是樹中所有葉結(jié)點的帶權(quán)路徑長度之和。樹的帶權(quán)路徑長度最小的二叉樹就稱為最優(yōu)二叉樹即哈夫曼樹。在葉子的權(quán)值相同的二叉樹中,完全二叉樹的路徑長度最短。哈夫曼樹有n個葉結(jié)點,共有2n-1個結(jié)點,沒有度為1的結(jié)點,這類樹又稱為嚴(yán)格二叉樹。變長編碼技術(shù)可以使頻度高的字符編碼短,而頻度低的字符編碼長,但是變長編碼可能使解碼產(chǎn)生二義性。如00、01、0001這三個碼無法在解碼時確定是哪一個,所以要求在字符編

20、碼時任一字符的編碼都不是其他字符編碼的前綴,這種碼稱為前綴碼其實是非前綴碼。哈夫曼樹的應(yīng)用最廣泛地是在編碼技術(shù)上,它能夠容易地求出給定字符集及其概率分布的最優(yōu)前綴碼。哈夫曼編碼的構(gòu)造很容易,只要畫好了哈夫曼樹,按分支情況在左路徑上寫代碼0,右路徑上寫代碼1,然后從上到下到葉結(jié)點的相應(yīng)路徑上的代碼的序列就是該結(jié)點的最優(yōu)前綴碼。第七章 圖圖的邏輯結(jié)構(gòu)特征就是其結(jié)點頂點的前趨和后繼的個數(shù)都是沒有限制的,即任意兩個結(jié)點之間之間都可能相關(guān)。圖GraphG=V,E,V是頂點的有窮非空集合,E是頂點偶對的有窮集。有向圖Digraph:每條邊有方向;無向圖Undigraph:每條邊沒有方向。有向完全圖:具有n

21、*n-1條邊的有向圖;無向完全圖:具有n*n-1/2條邊的無向圖;有根圖:有一個頂點有路徑到達(dá)其它頂點的有向圖;簡單路徑:是經(jīng)過頂點不同的路徑;簡單回路是開始和終端重的簡單路徑;網(wǎng)絡(luò):是帶權(quán)的圖。圖的存儲結(jié)構(gòu):鄰接矩陣表示法:用一個n階方陣來表示圖的結(jié)構(gòu)是唯一的,適合稠密圖。無向圖:鄰接矩陣是對稱的。有向圖:行是出度,列是入度。建立鄰接矩陣算法的時間是On+n2+e,其時間復(fù)雜度為On2鄰接表表示法:用頂點表和鄰接表構(gòu)成不是唯一的,適合稀疏圖。頂點表結(jié)構(gòu) vertex | firstedge,指針域存放鄰接表頭指針。鄰接表:用頭指針確定。 無向圖稱邊表;有向圖又分出邊表和逆鄰接表;鄰接表結(jié)點結(jié)

22、構(gòu)為 adjvex | next,時間復(fù)雜度為On+e。,空間復(fù)雜度為On+e。圖的遍歷: 深度優(yōu)先遍歷:借助于鄰接矩陣的列。使用棧保存已訪問結(jié)點。廣度優(yōu)先遍歷:借助于鄰接矩陣的行。使用隊列保存已訪問結(jié)點。生成樹的定義:假設(shè)從圖的某個頂點出發(fā),可以系統(tǒng)地訪問到圖中所有頂點,那么遍歷時經(jīng)過的邊和圖的所有頂點構(gòu)成的子圖稱作該圖的生成樹。最小生成樹:圖的生成樹不唯一,從不同的頂點出發(fā)可得到不同的生成樹,把權(quán)值最小的生成樹稱為最小生成樹MST。構(gòu)造最小生成樹的算法: Prim算法的時間復(fù)雜度為On2與邊數(shù)無關(guān)適于稠密圖。Kruskal算法的時間復(fù)雜度為Olge,主要取決于邊數(shù),較適合于稀疏圖。最短路徑

23、的算法:Dijkstra算法,時間復(fù)雜度為On2。類似于prim算法。拓?fù)渑判颍菏菍⒂邢驘o環(huán)圖G中所有頂點排成一個線性序列,假設(shè)EG,那么在線性序列u在v之前,這種線性序列稱為拓?fù)湫蛄?。拓?fù)渑判蛞灿袃煞N方法:無前趨的頂點優(yōu)先,每次輸出一個無前趨的結(jié)點并刪去此結(jié)點及其出邊,最后得到的序列即拓?fù)湫蛄?。無后繼的結(jié)點優(yōu)先:每次輸出一個無后繼的結(jié)點并刪去此結(jié)點及其入邊,最后得到的序列是逆拓?fù)湫蛄?。第八?排序記錄中可用某一項來標(biāo)識一個記錄,那么稱為關(guān)鍵字項,該數(shù)據(jù)項的值稱為關(guān)鍵字。排序是使文件中的記錄按關(guān)鍵字遞增或遞減次序排列起來。根本操作:比擬關(guān)鍵字大小;改變指向記錄的指針或移動記錄。存儲結(jié)構(gòu):順序結(jié)

24、構(gòu)、鏈表結(jié)構(gòu)、索引結(jié)構(gòu)。經(jīng)過排序后這些具有相同關(guān)鍵字的記錄之間的相對次序保持不變,那么稱這種排序方法是穩(wěn)定的,否那么排序算法是不穩(wěn)定的。排序過程中不涉及數(shù)據(jù)的內(nèi)、外存交換那么稱之為“內(nèi)部排序內(nèi)排序,反之,假設(shè)存在數(shù)據(jù)的內(nèi)外存交換,那么稱之為外排序。內(nèi)部排序方法可分五類:插入排序、選擇排序、交換排序、歸并排序和分配排序。評價排序算法好壞的標(biāo)準(zhǔn)主要有兩條:執(zhí)行時間和所需的輔助空間,另外算法的復(fù)雜程序也是要考慮的一個因素。插入排序:直接插入排序: 逐個向前插入到適宜位置。哨兵監(jiān)視哨有兩個作用: 作為臨變量存放Ri是在查找循環(huán)中用來監(jiān)視下標(biāo)變量j是否越界。直接插入排序是就地的穩(wěn)定排序。時間復(fù)雜度為On

25、2,比擬次數(shù)為n+2n-1/2;移動次數(shù)為n+4n-1/2;希爾排序: 等間隔的數(shù)據(jù)比擬并按要求順序排列,最后間隔為1.希爾排序是就地的不穩(wěn)定排序。時間復(fù)雜度為On1.25,比擬次數(shù)為n1.25;移動次數(shù)為1.6n1.25;交換排序:冒泡排序:自下向上確定最輕的一個。自上向下確定最重的一個。自下向上確定最輕的一個,后自上向下確定最重的一個。冒泡排序是就地的穩(wěn)定排序。時間復(fù)雜度為On2,比擬次數(shù)為nn-1/2;移動次數(shù)為3nn-1/2;快速排序:以第一個元素為參考基準(zhǔn),設(shè)定、動兩個指針,發(fā)生交換后指針交換位置,直到指針重合。重復(fù)直到排序完成??焖倥判蚴欠蔷偷氐牟环€(wěn)定排序。時間復(fù)雜度為Onlog2

26、n,比擬次數(shù)為nn-1/2;選擇排序:直接選擇排序: 選擇最小的放在比擬區(qū)前。直接選擇排序就地的不穩(wěn)定排序。時間復(fù)雜度為On2。比擬次數(shù)為nn-1/2;堆排序 建堆:按層次將數(shù)據(jù)填入完全二叉樹,從intn/2處向前逐個調(diào)整位置。然后將樹根與最后一個葉子交換值并斷開與樹的連接并重建堆,直到全斷開。堆排序是就地不穩(wěn)定的排序,時間復(fù)雜度為Onlog2n,不適宜于記錄數(shù)較少的文件。歸并排序: 先兩個一組排序,形成n+1/2組,再將兩組并一組,直到剩下一組為止。歸并排序是非就地穩(wěn)定排序,時間復(fù)雜度是Onlog2n,分配排序:箱排序: 按關(guān)鍵字的取值范圍確定箱子數(shù),按關(guān)鍵字投入箱子,鏈接所有非空箱。箱排序

27、的平均時間復(fù)雜度是線性的On?;鶖?shù)排序:從低位到高位依次對關(guān)鍵字進(jìn)行箱排序?;鶖?shù)排序是非就穩(wěn)定的排序,時間復(fù)雜度是Od*n+d*rd。各種排序方法的比擬和選擇: 待排序的記錄數(shù)目n;n較大的要用時間復(fù)雜度為Onlog2n的排序方法;記錄的大小規(guī)模;記錄大最好用鏈表作為存儲結(jié)構(gòu),而快速排序和堆排序在鏈表上難于實現(xiàn);關(guān)鍵字的結(jié)構(gòu)及其初始狀態(tài);對穩(wěn)定性的要求;語言工具的條件; 存儲結(jié)構(gòu);時間和輔助空間復(fù)雜度。第九章 查找查找的同時對表做修改操作如插入或刪除那么相應(yīng)的表稱之為動態(tài)查找表,否那么稱之為靜態(tài)查找表。衡量查找算法效率優(yōu)劣的標(biāo)準(zhǔn)是在查找過程中對關(guān)鍵字需要執(zhí)行的平均比擬次數(shù)即平均查找長度ASL。

28、線性表查找的方法: 順序查找:逐個查找,ASL=n+1/2;二分查找:取中點intn/2比擬,假設(shè)小就比左區(qū)間,大就比右區(qū)間。用二叉判定樹表示。ASL=每層結(jié)點數(shù)*層數(shù)/N.分塊查找。要求“分塊有序,將表分成假設(shè)干塊內(nèi)部不一定有序,并抽取各塊中的最大關(guān)鍵字及其位置建立有序索引表。二叉排序樹BST定義是:二叉排序樹是空樹或者滿足如下性質(zhì)的二叉樹: 假設(shè)它的左子樹非空,那么左子樹上所有結(jié)點的值均小于根結(jié)點的值;假設(shè)它的右子樹非空,那么右子樹上所有結(jié)點的值均大于根結(jié)點的值;左、右子樹本身又是一棵二叉排序樹。二叉排序樹的插入、建立、刪除的算法平均時間性能是Onlog2n。二叉排序樹的刪除操作可分三種情

29、況進(jìn)行處理: *P是葉子,那么直接刪除*P,即將*P的雙親*parent中指向*P的指針域置空即可。*P只有一個孩子*child,此時只需將*child和*p的雙親直接連接就可刪去*p.*p有兩個孩子,那么先將*p結(jié)點的中序后繼結(jié)點的數(shù)據(jù)到*p,刪除中序后繼結(jié)點。關(guān)于B-樹多路平衡查找樹。它適合在磁盤等直接存取設(shè)備上組織動態(tài)的查找表,是一種外查找算法。建立的方式是從下向上拱起。散列技術(shù):將結(jié)點按其關(guān)鍵字的散列地址存儲到散列表的過程稱為散列。散列函數(shù)的選擇有兩條標(biāo)準(zhǔn):簡單和均勻。常見的散列函數(shù)構(gòu)的造方法:平方取中法:hash=intx2%100除余法:表長為m,hash=x%m相乘取整法:has

30、h=intm*x*A-intx*A;A=0.618 隨機(jī)數(shù)法:hash=randomx。處理沖突的方法:開放定址法: 一般形式為hi=hkey+di%m1im-1,開放定址法要求散列表的裝填因子1. 開放定址法類型: 線性探查法:address=hashx+i%m;二次探查法:address=hashx+i2%m; 雙重散列法:address=hashx+i*hashy%m; 拉鏈法: 是將所有關(guān)鍵字為同義詞的結(jié)點鏈接在同一個單鏈表中。 拉鏈法的優(yōu)點: 拉鏈法處理沖突簡單,且無堆積現(xiàn)象; 鏈表上的結(jié)點空間是動態(tài)申請的適于無法確定表長的情況; 拉鏈法中可以大于1,結(jié)點較大時其指針域可忽略,因此節(jié)

31、省空間;拉鏈法構(gòu)造的散列表刪除結(jié)點易實現(xiàn)。拉鏈法也有缺點:當(dāng)結(jié)點規(guī)模較小時,用拉鏈法中的指針域也要占用額外空間,還是開放定址法省空間。第十章 排序10.1 排序的根本概念 10.2 插入排序10.3 選擇排序10.4 交換排序本章主要知識點:排序的根本概念和衡量排序算法優(yōu)劣的標(biāo)準(zhǔn),其中衡量標(biāo)準(zhǔn)有算法的時間復(fù)雜度、空間復(fù)雜度和穩(wěn)定性直接插入排序,希爾排序直接選擇排序,堆排序冒泡排序,快速排序10.1排序的根本概念1.排序是對數(shù)據(jù)元素序列建立某種有序排列的過程。2.排序的目的:便于查找。3.關(guān)鍵字是要排序的數(shù)據(jù)元素集合中的一個域,排序是以關(guān)鍵字為基準(zhǔn)進(jìn)行的。 關(guān)鍵字分主關(guān)鍵字和次關(guān)鍵字兩種。對要排

32、序的數(shù)據(jù)元素集合來說,如果關(guān)鍵字滿足數(shù)據(jù)元素值不同時該關(guān)鍵字的值也一定不同,這樣的關(guān)鍵字稱為主關(guān)鍵字。不滿足主關(guān)鍵字定義的關(guān)鍵字稱為次關(guān)鍵字。4.排序的種類:分為內(nèi)部排序和外部排序兩大類。 假設(shè)待排序記錄都在內(nèi)存中,稱為內(nèi)部排序;假設(shè)待排序記錄一局部在內(nèi)存,一局部在外存,那么稱為外部排序。 注:外部排序時,要將數(shù)據(jù)分批調(diào)入內(nèi)存來排序,中間結(jié)果還要及時放入外存,顯然外部排序要復(fù)雜得多。 5.排序算法好壞的衡量標(biāo)準(zhǔn):(1)時間復(fù)雜度 它主要是分析記錄關(guān)鍵字的比擬次數(shù)和記錄的移動次數(shù)。(2)空間復(fù)雜度算法中使用的內(nèi)存輔助空間的多少。(3)穩(wěn)定性假設(shè)兩個記錄A和B的關(guān)鍵字值相等,但排序后A、B的先后次

33、序保持不變,那么稱這種排序算法是穩(wěn)定的。10.2 插入排序 插入排序的根本思想是:每步將一個待排序的對象,按其關(guān)鍵字大小,插入到前面已經(jīng)排好序的一組對象的適當(dāng)位置上,直到對象全部插入為止。 簡言之,邊插入邊排序,保證子序列中隨時都是排好序的。 常用的插入排序有:直接插入排序和希爾排序兩種。10.2.1 1、其根本思想是: 順序地把待排序的數(shù)據(jù)元素按其關(guān)鍵字值的大小插入到已排序數(shù)據(jù)元素子集合的適當(dāng)位置。 例1:關(guān)鍵字序列T=13,6,3,31,9,27,5,11,請寫出直接插入排序的中間過程序列。初始關(guān)鍵字序列:【13】, 6, 3, 31, 9, 27, 5, 11第一次排序: 【6, 13】

34、, 3, 31, 9, 27, 5, 11第二次排序: 【3, 6, 13】, 31, 9, 27, 5, 11第三次排序: 【3, 6, 13,31】, 9, 27, 5, 11第四次排序: 【3, 6, 9, 13,31】, 27, 5, 11第五次排序: 【3, 6, 9, 13,27, 31】, 5, 11第六次排序: 【3, 5, 6, 9, 13,27, 31】, 11第七次排序: 【3, 5, 6, 9, 11,13,27, 31】 注:方括號 中為已排序記錄的關(guān)鍵字,下劃橫線的 關(guān)鍵字表示它對應(yīng)的記錄后移一個位置。2.直接插入排序算法public static void ins

35、ertSort(int a)int i, j, temp;int n = a.Length;for(i = 0; i -1 & temp aj)aj + 1 = aj;j -; aj + 1 = temp;初始關(guān)鍵字序列:【13】, 6, 3, 31, 9, 27, 5, 11第一次排序: 【6, 13】, 3, 31, 9, 27, 5, 11第二次排序: 【3, 6, 13】, 31, 9, 27, 5, 113、直接插入排序算法分析(1)時間效率:當(dāng)數(shù)據(jù)有序時,執(zhí)行效率最好,此時的時間復(fù)雜度為O(n);當(dāng)數(shù)據(jù)根本反序時,執(zhí)行效率最差,此時的時間復(fù)雜度為O(n2)。所以當(dāng)數(shù)據(jù)越接近有序,直

36、接插入排序算法的性能越好。 (2)空間效率:僅占用1個緩沖單元O1 (3)算法的穩(wěn)定性:穩(wěn)定8.2.2 希爾shell排序 又稱縮小增量排序1、根本思想:把整個待排序的數(shù)據(jù)元素分成假設(shè)干個小組,對同一小組內(nèi)的數(shù)據(jù)元素用直接插入法排序;小組的個數(shù)逐次縮小,當(dāng)完成了所有數(shù)據(jù)元素都在一個組內(nèi)的排序后排序過程結(jié)束。 2、技巧:小組的構(gòu)成不是簡單地“逐段分割,而是將相隔某個增量d的記錄組成一個小組,讓增量d逐趟縮短例如依次取5,3,1,直到d1為止。3、優(yōu)點:讓關(guān)鍵字值小的元素能很快前移,且序列假設(shè)根本有序時,再用直接插入排序處理,時間效率會高很多。例2:設(shè)待排序的序列中有12個記錄,它們的關(guān)鍵字序列

37、T=(65,34,25,87,12,38,56,46,14,77,92,23,請寫出希爾排序的具體實現(xiàn)過程。public static void shellSort(int a, int d, int numOfD)int i, j, k, m, span;int temp;int n = a.Length;for(m = 0; m numOfD; m +)/共numOfD次循環(huán)span = dm; /取本次的增量值for(k = 0; k span; k +)/共span個小組for(i = k; i -1 & temp aj)aj + span = aj;j = j - span;aj +

38、 span = temp;算法分析:開始時d 的值較大,子序列中的對象較少,排序速度較快;隨著排序進(jìn)展,d 值逐漸變小,子序列中對象個數(shù)逐漸變多,由于前面工作的根底,大多數(shù)記錄已根本有序,所以排序速度仍然很快。 時間效率:O(n(log2n)2) 空間效率:O1因為僅占用1個緩沖單元 算法的穩(wěn)定性:不穩(wěn)定 練習(xí):1. 欲將序列Q, H, C, Y, P, A, M, S, R, D, F, X中的關(guān)鍵碼按字母升序重排,那么初始d為4的希爾排序一趟的結(jié)果是?答: 原始序列: Q, H, C, Y, P, A, M, S, R, D, F, Xshell一趟后: P,A,C,S,Q,D,F,X,R

39、,H,M,Y2. 以關(guān)鍵字序列256,301,751,129,937,863,742,694,076,438為例,寫出執(zhí)行希爾排序取d=5,3,1算法的各趟排序結(jié)束時,關(guān)鍵字序列的狀態(tài)。解:原始序列: 256,301,751,129,937,863,742,694,076,438希爾排序第一趟d=5 256 301 694 076 438 863 742 751 129 937 第二趟d=3 076 301 129 256 438 694 742 751 863 937第三趟d=1 076 129 256 301 438 694 742 751 863 93710.3 選擇排序 選擇排序的根本

40、思想是:每次從待排序的數(shù)據(jù)元素集合中選取關(guān)鍵字最小或最大的數(shù)據(jù)元素放到數(shù)據(jù)元素集合的最前或最后,數(shù)據(jù)元素集合不斷縮小,當(dāng)數(shù)據(jù)元素集合為空時選擇排序結(jié)束。常用的選擇排序算法: 1直接選擇排序 2堆排序10.3.11、其根本思想 每經(jīng)過一趟比擬就找出一個最小值,與待排序列最前面的位置互換即可。即從待排序的數(shù)據(jù)元素集合中選取關(guān)鍵字最小的數(shù)據(jù)元素并將它與原始數(shù)據(jù)元素集合中的第一個數(shù)據(jù)元素交換位置;然后從不包括第一個位置的數(shù)據(jù)元素集合中選取關(guān)鍵字最小的數(shù)據(jù)元素并將它與原始數(shù)據(jù)集合中的第二個數(shù)據(jù)元素交換位置;如此重復(fù),直到數(shù)據(jù)元素集合中只剩一個數(shù)據(jù)元素為止。2、優(yōu)缺點優(yōu)點:實現(xiàn)簡單缺點:每趟只能確定一個元

41、素,表長為n時需要n-1趟例3:關(guān)鍵字序列T= 21,25,49,25*,16,08,請給出直接選擇排序的具體實現(xiàn)過程。原始序列: 21,25,49,25*,16,08第1趟 08,25,49,25*,16,21第2趟 08,16, 49,25*,25,21第3趟 08,16, 21,25*,25,49第4趟 08,16, 21,25*,25,49第5趟 08,16, 21,25*,25,49public static void selectSort(int a)int i, j, small;int temp;int n = a.Length;for(i = 0; i n - 1; i +)

42、 small = i; /設(shè)第i個數(shù)據(jù)元素最小 for(j = i + 1; j n; j +)/尋找最小的數(shù)據(jù)元素 if(aj asmall) small = j; /記住最小元素的下標(biāo) if(small != i) /當(dāng)最小元素的下標(biāo)不為i時交換位置 temp = ai; ai = asmall; asmall = temp; 3、算法分析時間效率: O(n2)雖移動次數(shù)較少,但比擬次數(shù)仍多。 空間效率:O1沒有附加單元僅用到1個temp)算法的穩(wěn)定性:不穩(wěn)定4、穩(wěn)定的直接選擇排序算法例:關(guān)鍵字序列T= 21,25,49,25*,16,08,請給出穩(wěn)定的直接選擇排序的具體實現(xiàn)過程。原始序列

43、: 21,25,49,25*,16,08第1趟08, 21 , 25 , 49 , 25 *, 16 第2趟08,16, 21,25,49 ,25 *第3趟08,16, 21,25,49 ,25 *第4趟08,16, 21,25,49 ,25 *第5趟08,16, 21,25,25 * ,49public static void selectSort2(int a)int i,j,small;int temp;int n = a.Length;for(i = 0; i n-1; i+) small = i; for(j = i+1; j n; j+) /尋找最小的數(shù)據(jù)元素 if(aj i; j

44、-) /把該區(qū)段尚未排序元素依次后移aj = aj-1;ai = temp; /插入找出的最小元素 8.3.2 堆排序1. 什么是堆? 2. 怎樣建堆? 3. 怎樣堆排序?堆的定義:設(shè)有n個數(shù)據(jù)元素的序列 k0,k1,kn-1,當(dāng)且僅當(dāng)滿足下述關(guān)系之一時,稱之為堆。 解釋:如果讓滿足以上條件的元素序列 k,k,kn順次排成一棵完全二叉樹,那么此樹的特點是: 樹中所有結(jié)點的值均大于或小于其左右孩子,此樹的根結(jié)點即堆頂必最大或最小。例4:有序列T1=08, 25, 49, 46, 58, 67和序列T2=91, 85, 76, 66, 58, 67, 55,判斷它們是否 “堆?2. 怎樣建堆?步驟

45、:從第一個非終端結(jié)點開始往前逐步調(diào)整,讓每個雙親大于或小于子女,直到根結(jié)點為止。終端結(jié)點即葉子沒有任何子女,無需單獨調(diào)整例:關(guān)鍵字序列T= (21,25,49,25*,16,08,請建最大堆。解:為便于理解,先將原始序列畫成完全二叉樹的形式: 這樣可以很清晰地從(n-1-1)/2開始調(diào)整。public static void createHeap(int a, int n, int h)int i, j, flag;int temp;i = h; j = 2 * i + 1; / j為i結(jié)點的左孩子結(jié)點的下標(biāo)temp = ai;flag = 0; while(j n & flag != 1)/

46、尋找左右孩子結(jié)點中的較大者,j為其下標(biāo)if(j n - 1 & aj = aj) /ai=ajflag = 1; /標(biāo)記結(jié)束篩選條件else/否那么把a(bǔ)j上移ai = aj;i = j;j = 2 * i + 1;ai = temp; 利用上述createHeapa,n,h函數(shù),初始化創(chuàng)立最大堆的過程就是從第一個非葉子結(jié)點ai開始,到根結(jié)點a0為止,循環(huán)調(diào)用createHeapa,n,h的過程。初始化創(chuàng)立最大堆算法如下:public static void initCreateHeap(int a)int n = a.Length;for(int i = (n-1-1) / 2; i = 0;

47、 i -)createHeap(a, n, i);3. 怎樣進(jìn)行整個序列的堆排序?*基于初始堆進(jìn)行堆排序的算法步驟: 堆的第一個對象a0具有最大的關(guān)鍵碼,將a0與an-1對調(diào),把具有最大關(guān)鍵碼的對象交換到最后;再對前面的n-1個對象,使用堆的調(diào)整算法,重新建立堆調(diào)整根結(jié)點使之滿足最大堆的定義。結(jié)果具有次最大關(guān)鍵碼的對象又上浮到堆頂,即a0位置;再對調(diào)a0和an-2,然后對前n-2個對象重新調(diào)整,如此反復(fù),最后得到全部排序好的對象序列。例5:對剛剛建好的最大堆進(jìn)行排序:public static void heapSort(int a)int temp;int n = a.Length;init

48、CreateHeap(a); /初始化創(chuàng)立最大堆for(int i = n - 1; i 0; i -)/當(dāng)前最大堆個數(shù)每次遞減1/把堆頂a0元素和當(dāng)前最大堆的最后一個元素交換temp = a0;a0 = ai;ai = temp;createHeap(a,i, 0); /調(diào)整根結(jié)點滿足最大堆4、堆排序算法分析:時間效率:O(nlog2n)??臻g效率:O(1)。穩(wěn)定性: 不穩(wěn)定。練習(xí)1:以下序列是堆的是 75,65,30,15,25,45,20,10 B. 75,65,45,10,30,25,20,15C. 75,45,65,30,15,25,20,10 D. 75,45,65,10,25,3

49、0,20,15 練習(xí)2:有一組數(shù)據(jù)15,9,7,8,20,1,7*,4,建成的最小堆為 。A.1,4,8,9,20,7,15,7* B.1,7,15,7*,4,8,20,9C.1,4,7,8,20,15,7*,9 D.以上都不對練習(xí)3:序列503,87,512,61,908,170,897,275,653,462,寫出采用堆排序?qū)υ撔蛄凶鞣沁f減排列時的排序過程。排序好的序列為:61,87,170,275,462,503,512,653,897,90810.4 交換排序交換排序的根本思想是:利用交換數(shù)據(jù)元素的位置進(jìn)行排序的方法。交換排序的主要算法有: 1) 冒泡排序 2) 快速排序10.4.11

50、、根本思路:每趟不斷將記錄兩兩比擬,并按“前小后大或“前大后小規(guī)那么交換。2、優(yōu)點:每趟結(jié)束時,不僅能擠出一個最大值到最后面位置,還能同時局部理順其他元素;一旦下趟沒有交換發(fā)生,還可以提前結(jié)束排序。例:關(guān)鍵字序列 T=(21,25,49,25*,16,08,請按從小到大的順序,寫出冒泡排序的具體實現(xiàn)過程。初態(tài):21,25,49, 25*,16, 08第1趟21,25,25*,16, 08 , 49第2趟21,25, 16, 08 ,25*,49第3趟21,16, 08 ,25, 25*,49第4趟16,08 ,21, 25, 25*,49第5趟08,16, 21, 25, 25*,493、冒泡

51、排序算法public static void bubbleSort(int a)int i, j, flag=1;int temp;int n = a.Length;for(i = 1; i n & flag = 1; i+)flag = 0;for(j = 0; j aj+1)flag = 1;temp = aj;aj = aj+1;aj+1 = temp;4、冒泡排序的算法分析時間效率:On2) 因為要考慮最壞情況數(shù)據(jù)元素全部逆序,當(dāng)然最好情況是數(shù)據(jù)元素已全部排好序,此時循環(huán)n-1次,時間復(fù)雜度為On) 空間效率:O1 只在交換時用到一個緩沖單元 穩(wěn) 定 性: 穩(wěn)定 25和25*在排序前后

52、的次序未改變練習(xí):關(guān)鍵字序列 T=(31,15,9,25,16,28,請按從小到大的順序,寫出冒泡排序的具體實現(xiàn)過程。初態(tài):31,15,9, 25,16, 28第1趟15,9,25,16, 28, 31第2趟9,15, 16, 25,28,31第3趟9,15, 16,25, 28,311、根本思想:設(shè)數(shù)組a中存放了n個數(shù)據(jù)元素,low為數(shù)組的低端下標(biāo),high為數(shù)組的高端下標(biāo),從數(shù)組a中任取一個元素通常取alow做為標(biāo)準(zhǔn)元素,以該標(biāo)準(zhǔn)元素調(diào)整數(shù)組a中其他各個元素的位置,使排在標(biāo)準(zhǔn)元素前面的元素均小于標(biāo)準(zhǔn)元素,排在標(biāo)準(zhǔn)元素后面的均大于或等于標(biāo)準(zhǔn)元素。這樣一次排序過程結(jié)束后,一方面將標(biāo)準(zhǔn)元素放在了

53、未來排好序的數(shù)組中該標(biāo)準(zhǔn)元素應(yīng)位于的位置上,另一方面將數(shù)組中的元素以標(biāo)準(zhǔn)元素為中心分成了兩個子數(shù)組,位于標(biāo)準(zhǔn)元素左邊子數(shù)組中的元素均小于標(biāo)準(zhǔn)元素,位于標(biāo)準(zhǔn)元素右邊子數(shù)組中的元素均大于等于或標(biāo)準(zhǔn)元素。對這兩個子數(shù)組中的元素分別再進(jìn)行方法類同的遞歸快速排序。算法的遞歸出口條件是lowhigh。 例、關(guān)鍵字序列 T=(60,55,48,37,10,90,84,36,請按從小到大的順序,寫出快速排序的具體實現(xiàn)過程。 快速排序算法各次快速排序過程 3、快速排序算法public static void quickSort(int a, int low, int high)int i, j;int temp

54、;i = low;j = high;temp = alow; /取第一個元素為標(biāo)準(zhǔn)數(shù)據(jù)元素 while(i j) /在數(shù)組的右端掃描while(i j & temp = aj) j-;if(i j)ai = aj;i+; /在數(shù)組的左端掃描 while(i j & ai temp) i+;if(i j)aj = ai;j-; ai = temp; if(low i) quickSort(a, low, i-1); /對左端子集合遞歸 if(i high) quickSort(a, j+1, high); /對右端子集合遞歸4、快速排序算法分析:時間效率:一般情況下時間復(fù)雜度為O(nlog2n),最壞情況是數(shù)據(jù)元素已全部正序或反序有序,此時每次標(biāo)準(zhǔn)元素都把當(dāng)前數(shù)組分成一個大小比當(dāng)前數(shù)組小1的子數(shù)組,此時時間復(fù)雜度為O(n2) 空間效率:Olog2n因為遞歸要用棧 穩(wěn) 定 性: 不 穩(wěn) 定 因為有跳躍式交換。練習(xí):序列503,87,512,61,908,170,897,275,653,462,給出采用快速排序?qū)υ撔蛄凶鞣沁f減排序時每趟的結(jié)果。第一趟:【462 87 275 61 170】 503 【 8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論