版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)緒論時(shí)間復(fù)雜度T(n)=O(f(n))通常用:常量階O(1)線性階O(n)平方階O(n^2)對數(shù)階O(logn)指數(shù)階O(2^n)計(jì)算的復(fù)雜性:算法的計(jì)算量的大小算法的時(shí)間復(fù)雜度取決于問題的規(guī)模和待處理數(shù)據(jù)的初態(tài)。算法:是對特定問題求解步驟的一種描述,它是指令的有限序列。(1)有窮性(2)確定性(3)可行性(4)輸入(5)輸出從邏輯上可以把數(shù)據(jù)結(jié)構(gòu)分為線性結(jié)構(gòu)和非線性結(jié)構(gòu)棧與數(shù)據(jù)的存儲結(jié)構(gòu)無關(guān)串是線性結(jié)構(gòu)有序表屬于邏輯結(jié)構(gòu)連續(xù)存儲設(shè)計(jì)時(shí),存儲單元的地址一定連續(xù)一、數(shù)據(jù):是對客觀事物的符號表示,在計(jì)算機(jī)科學(xué)中是指所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號的總稱。它是計(jì)算機(jī)程序加工的“原料”。二、數(shù)據(jù)元素:是數(shù)據(jù)的基本單位,在計(jì)算機(jī)程序中通常作為一個(gè)整體進(jìn)行考慮和處理。一個(gè)數(shù)據(jù)元素可由若干個(gè)數(shù)據(jù)項(xiàng)組成。數(shù)據(jù)項(xiàng)是數(shù)據(jù)的不可分割的最小單位。三、數(shù)據(jù)對象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第1頁。四、數(shù)據(jù)機(jī)構(gòu):是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。在任何問題中,數(shù)據(jù)元素都不是孤立存在的,而是在它們之間存在著某種關(guān)系,這種數(shù)據(jù)元素相互之間的關(guān)系稱為結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第1頁。五、元素在存貯結(jié)構(gòu)(1)物理結(jié)構(gòu)(存儲結(jié)構(gòu)):它包括數(shù)據(jù)元素的表示和關(guān)系。(2)邏輯結(jié)構(gòu)六、位bit:在計(jì)算機(jī)中表示信息的最小單位是二進(jìn)制的一位七、元素element/節(jié)點(diǎn)node:位串八、數(shù)據(jù)域:當(dāng)數(shù)據(jù)元素由若干數(shù)據(jù)項(xiàng)組成時(shí),位串中對應(yīng)于各個(gè)數(shù)據(jù)項(xiàng)的子位串九、數(shù)據(jù)元素之間的關(guān)系在計(jì)算機(jī)中有兩種不同的表示方法,順序映像和非順序映像,并由此得到兩種不同的存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)(借助元素在存儲器中的相對位置來表示數(shù)據(jù)元素之間的邏輯關(guān)系)和鏈?zhǔn)酱鎯Y(jié)構(gòu)(借助指示元素存儲地址的指針表示數(shù)據(jù)元素之間的邏輯關(guān)系)。算法:是對特定問題求解步驟的一種描述,它是指令的有限序列。(1)有窮性(2)確定性(3)可行性(4)輸入(5)輸出算法設(shè)計(jì)要求:(1)正確性(2)可讀性(3)健壯性(4)效率與低存儲量需求-------------------------------------------------------------------------------線性表:采用順序存儲,便于進(jìn)行插入和刪除的操作順序表的優(yōu)點(diǎn):結(jié)構(gòu)緊湊,存儲空間利用率高,操作簡單。(存儲密度大)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第2頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第2頁。當(dāng)線性表的元素總數(shù)基本穩(wěn)定,且很少進(jìn)行插入和刪除操作,但要求以最快的速度存取線性表中的元素時(shí),應(yīng)采用順序存儲結(jié)構(gòu)。若某線性表最常用的操作是存取任一指定序號的元素和最后進(jìn)行插入和刪除運(yùn)算,則利用順序表的存儲方式最節(jié)省時(shí)間;若某線性表最常用的操作是在最后一個(gè)元素之后插入一個(gè)元素和刪除一個(gè)元素,則采用僅有尾指針的單循環(huán)鏈表的存儲方式最節(jié)省時(shí)間。設(shè)一個(gè)鏈表最常用的操作是在末尾插入結(jié)點(diǎn)或刪除尾結(jié)點(diǎn),則利用帶頭結(jié)點(diǎn)的雙循環(huán)鏈表的存儲方式最節(jié)省時(shí)間。若某表最常用的操作是在最后一個(gè)結(jié)點(diǎn)之后插入一個(gè)結(jié)點(diǎn)或刪除最后一個(gè)結(jié)點(diǎn),則利用帶頭結(jié)點(diǎn)的雙循環(huán)鏈表的存儲方式最節(jié)省時(shí)間。鏈表的優(yōu)點(diǎn):在空間的合理利用上和插入、刪除時(shí)不需要移動,是線性表的首選存儲結(jié)構(gòu)。(不必事先估計(jì)存儲空間、所需空間與線性長度成正比)缺點(diǎn):求線性表的長度時(shí)不如順序存儲結(jié)構(gòu)(不可隨機(jī)訪問任一元素)線性表在順序存儲時(shí),查找第i個(gè)元素的時(shí)間同i的值無關(guān);線性表在鏈?zhǔn)酱鎯r(shí),查找第i個(gè)元素的時(shí)間同i的值成正比。對于順序存儲的線性表,訪問結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1),插入和刪除結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(n)。對于鏈?zhǔn)酱鎯Φ木€性表,訪問第i個(gè)元素的時(shí)間復(fù)雜度為O(n)。對于一個(gè)具有n個(gè)結(jié)點(diǎn)的單鏈表,在已知的結(jié)點(diǎn)*p后插入一個(gè)新結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(1),在給定值為x的結(jié)點(diǎn)后插入一個(gè)新結(jié)點(diǎn)的時(shí)間復(fù)雜度為O(n)根據(jù)線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)中每一個(gè)結(jié)點(diǎn)包含的指針個(gè)數(shù),將線性鏈表分為單鏈表和多重鏈表;根據(jù)指針的連接方式,鏈表又可分為動態(tài)鏈表和靜態(tài)鏈表。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第3頁。鏈表的頭結(jié)點(diǎn)的作用:數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第3頁。靜態(tài)鏈表中指針表示的是下一個(gè)元素地址靜態(tài)鏈表能容納的元素個(gè)數(shù)的最大數(shù)在表定義時(shí)就確定了,以后不能增加。靜態(tài)鏈表與動態(tài)鏈表在元素的插入、刪除上類似,不需做元素的移動。線性表是線性結(jié)構(gòu)的基本形式線性表的邏輯結(jié)構(gòu)線性表的定義線性結(jié)構(gòu)的特點(diǎn)是數(shù)據(jù)元素之間是一種線性關(guān)系,數(shù)據(jù)元素“一個(gè)接一個(gè)的排列”。線性表是具有相同數(shù)據(jù)類型的n(n>=0)個(gè)數(shù)據(jù)元素的有限序列,記為:(a1,a2,…ai-1,ai,ai+1,…an);其中:n為表長,n=0時(shí)稱為空表。表中相鄰元素之間存在順序關(guān)系:ai-1稱為ai的直接前趨,ai+1稱為ai的直接后繼。a1,…an-1有且僅有一個(gè)直接后繼;(非空線性表)a2,…an有且僅有一個(gè)直接前趨。(非空線性表)線性表的順序存儲是指在內(nèi)存中用地址連續(xù)的一塊存儲空間順序存放線性表的各元素,用這種存儲形式存儲的線性表稱其為順序表。存儲的特點(diǎn):物理上的相鄰實(shí)現(xiàn)了邏輯相鄰的表示。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第4頁。順序存儲能隨機(jī)訪問第i個(gè)元素:數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第4頁。設(shè)a1的存儲地址為Loc(a1),每個(gè)數(shù)據(jù)元素占d個(gè)存儲地址,則第i個(gè)數(shù)據(jù)元素的地址為:Loc(ai)=Loc(a1)+(i-1)*d1≤I≤n順序表插入運(yùn)算時(shí)間主要消耗:數(shù)據(jù)的移動。一般情況下,在第i(1<=i<=n)個(gè)元素之前插入一個(gè)元素時(shí),需將第n至第i(共n-i+1)個(gè)元素向后移動一個(gè)位置。(在第i個(gè)位置上插入x,從ai到an都要向下移動一個(gè)位置,共需要移動n-i+1個(gè)元素。)一般情況下,刪除第i(1<=i<=n)個(gè)元素時(shí),需從第i+1至第n(共n-i)個(gè)元素向前移動一個(gè)位置i的取值范圍為:1≤i≤n+1(即有n+1個(gè)位置可以插入)。設(shè)在第i個(gè)位置上作插入的概率為Pi:在等概率情況下:Pi=1/(n+1),則平均移動數(shù)據(jù)元素的次數(shù)則為:這說明:在順序表上做插入操作需移動表中一半的數(shù)據(jù)元素。顯然順序表上插入時(shí)間復(fù)雜度為O(n)。intSeqlistInsert(A[],n,i,x){if(i<1||i>n)//檢查插入位置的正確性{Printf(“參數(shù)非法”);return0;//插入位置參數(shù)錯(cuò),返回錯(cuò)誤代碼0數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第5頁。}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第5頁。else{for(k=n;k>=i;k--)A[k-1]<=A[k];//結(jié)點(diǎn)移動A[i]<=x;//新元素插入n<=n+1;//n指向新的最后元素returnn;//插入成功,返回成功代碼}}線性表的刪除運(yùn)算是指將表中第i個(gè)元素從線性表中去掉。SeqlistDelete(A[],n,i){if(i<1ORi>n)//檢查空表及刪除位置的合法性{Printf(“參數(shù)非法”);return0;//不存在第i個(gè)元素,返回錯(cuò)誤代碼0}else{for(k=i+1;k<n;k++)A[k-1]<=A[k];//數(shù)據(jù)元素向前移動數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第6頁。n<=n-1;//n指向新的最后元素?cái)?shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第6頁。returnn;//刪除成功,返回成功代碼}刪除算法的時(shí)間性能分析與插入運(yùn)算相同,其時(shí)間主要消耗在了移動元素上。計(jì)算數(shù)據(jù)移動的次數(shù):某次刪除數(shù)據(jù)的移動次數(shù)與具體位置有關(guān)。求平均性能。刪除第i個(gè)元素時(shí),其后面的元素ai+1~an都要向上移動一個(gè)位置,共移動了n-i個(gè)元素。i的取值范圍為:1≤i≤n(即有n個(gè)位置可以刪除)。設(shè)在第i個(gè)位置上作刪除的概率為Pi,平均移動數(shù)據(jù)元素的次數(shù):在等概率情況下:Pi=1/n,則平均移動數(shù)據(jù)元素的次數(shù)則為:這說明順序表上作刪除運(yùn)算時(shí)大約需要移動表中一半的元素。顯然該算法的時(shí)間復(fù)雜度為O(n)。線性表鏈?zhǔn)酱鎯Y(jié)構(gòu),不要求邏輯上相鄰的兩個(gè)數(shù)據(jù)元素物理上也相鄰,因此不需要用地址連續(xù)的存儲單元來實(shí)現(xiàn)。鏈表是通過一組任意的存儲單元來存儲線性表中的數(shù)據(jù)元素的,對每個(gè)數(shù)據(jù)元素ai,除了存放數(shù)據(jù)元素的自身的信息ai之外,還需要和ai一起存放其后繼ai+1所在的存貯單元的地址,這兩部分信息組成一個(gè)“結(jié)點(diǎn)”。存放數(shù)據(jù)元素信息的稱為數(shù)據(jù)域,存放其后繼地址的稱為指針域。鏈表的表示:鏈表是由一個(gè)個(gè)結(jié)點(diǎn)構(gòu)成的。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第7頁。結(jié)點(diǎn)的申請:p=newLNode;結(jié)點(diǎn)的釋放:deletep;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第7頁。在某結(jié)點(diǎn)后面插入新結(jié)點(diǎn):設(shè)p指向單鏈表中某結(jié)點(diǎn),s指向待插入的值為x的新結(jié)點(diǎn),將*s插入到*p的后面。操作如下:①s->next=p->next;②p->next=s;注意:兩個(gè)指針的操作順序不能交換。在某結(jié)點(diǎn)前面插入新結(jié)點(diǎn):設(shè)p指向鏈表中某結(jié)點(diǎn),s指向待插入的值為x的新結(jié)點(diǎn),將*s插入到*p的前面。與后插不同的是:首先要找到*p的前驅(qū)*q,然后再完成在*q之后插入*s。設(shè)單鏈表頭指針為L,操作如下:q=L;while(q->next!=p)q=q->next;//找*p的直接前驅(qū)s->next=q->next;q->next=s;刪除結(jié)點(diǎn):設(shè)p指向單鏈表中某結(jié)點(diǎn),刪除*p。作業(yè)1:線性表中元素為整型,以50為界,小于50在左,大于50在右。作業(yè)講解:x<=A[i];數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第8頁。 while(A[j]>=xandi<j)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第8頁。 { j<=j-1; if(A[j]<x) {A[i]<=A[j]; i<=i+1;}while(A[i]<xandx<j) i<=i+1;if(A[i]>=x){A[j] <=A[i];j<=j-1;}插入a1:*p=a1;改為:p->date=a1;指針p指向?qū)ο骴ate=a1,該對象是一個(gè)結(jié)構(gòu)體,指向結(jié)構(gòu)體里a1那部分刪除a1并把存儲空間解放:free(p);二、鏈表的構(gòu)造q<=NULL;for(j=n;i>=1;i--)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第9頁。{數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第9頁。p<=(NODE*)malloc(sizeof(NODE));p->date<=an;將an替換為ai注:i此處為n-1p->next<=NULL;把指針設(shè)為空指針,替換為qq<=p;}考慮鏈表的頭指針當(dāng)ai未插入時(shí):算法:CreatLinkList(n)構(gòu)造鏈表,n為節(jié)點(diǎn){q<=NULL;for(i=n;i>=1;i--){p<=(NODE*)malloc(sizeof(NODE));scanf(ai);p->date<=ai;p->next<=q;q<=p;}return(p);}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第10頁。注:此時(shí)p、q一樣∵已被賦值給對方數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第10頁。作業(yè)4:倒過來。從前節(jié)點(diǎn)到后節(jié)點(diǎn)。頭指針headp<=head;從頭指針出發(fā),依次輸出節(jié)點(diǎn)??捎胒or循環(huán)或while循環(huán)(不確定循環(huán)次數(shù)時(shí)用)p<=head;while(p=\NULL){printf(p->data);p<=p->next;}三、鏈表的插入算法:假定:在表中值為x的節(jié)點(diǎn)前面插入一個(gè)值為y的節(jié)點(diǎn)。分析:1.空鏈2.表中第1個(gè)節(jié)點(diǎn)的值為x3.表中有一個(gè)值為x的節(jié)點(diǎn)4.表中沒有值為x的節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第11頁。5.表中有多個(gè)值為x的節(jié)點(diǎn)。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第11頁。NODE*InsertLinkList(head,x,y){q<=(NODE*)malloc(sizeof(NODE));q->data<=y;q->next<=NULL;if(head=NULL)head<=q;elseif(head->date=x){q->next<=head;head<=q;}else{r<=head;p<=head->next;while(p->data=/xandp=\NULL)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第12頁。p<=p->next;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第12頁。if(p=\NULL){q->next<=p;r->next<=q;}elser->next<=q;}return(head);}假定:刪除表中值為x的節(jié)點(diǎn)分析:1.空表; 2.第1個(gè)節(jié)點(diǎn)的值為x; 3.在表中有值為x的節(jié)點(diǎn); 4.在表中沒有值為x的節(jié)點(diǎn)NODE*=DeleteLinkList(head,x,t)(返回指針)a.值參callbyvalue數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第13頁。{b.變參callbyaddress數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第13頁。 s<=NULL; if(head=NULL) printf("這是一個(gè)空表") elseif(head->data=x) { s<=head; head<=head->next; } else q<=head;(返回內(nèi)容不同) p<=head->next; while(p->data=\xandp->next=\NULL) { q<=p; p<=p->next; } if(p->data=x) { s<=p; q->next<=p->next;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第14頁。 }數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第14頁。 else printf("表中沒有值為x的節(jié)點(diǎn)");}if(s=\NULL){ t<=s->data; free(s); return(head);(返回值)}}四、鏈?zhǔn)酱尜A結(jié)構(gòu)的棧五、鏈?zhǔn)酱尜A結(jié)構(gòu)的隊(duì)列六、循環(huán)鏈表循環(huán)鏈表是另一種形式的鏈?zhǔn)酱鎯Y(jié)構(gòu)。它的特點(diǎn)是表中最后一個(gè)結(jié)點(diǎn)的指針域指向頭結(jié)點(diǎn),整個(gè)鏈表形成一個(gè)環(huán)。由此,從表中任一結(jié)點(diǎn)出發(fā)均可找到表中其他結(jié)點(diǎn)。雙向鏈表在雙向鏈表的結(jié)點(diǎn)中有兩個(gè)指針域,其一指向直接后繼,另一指向直接前驅(qū)。二叉鏈表的特征:n個(gè)結(jié)點(diǎn),則鏈指針?biāo)傅臑閚-1二叉鏈表總鏈域個(gè)數(shù)2n,頭指針指向根結(jié)點(diǎn),其余n-1個(gè)結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第15頁?!嘣谟衝個(gè)結(jié)點(diǎn)的K叉樹鏈表中,值為非空的鏈域個(gè)數(shù)為n-1;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第15頁??盏逆溣騻€(gè)數(shù)為kn-(n-1)=kn-n+1對于任意給定的一個(gè)線性表:L=(a1,a2,……,an),寫出構(gòu)造一個(gè)鏈表的算法。節(jié)點(diǎn)類型及其算法頭部約定如下:structnode{ElemTypedata;structnode*next;};typedefstructnodeNODE;NODE*CreateLinkList(intn)算法如下:NODE*CreateLinkList(intn){q(NODE*)malloc(sizeof(NODE));scanf(an);q->dataan;q->nextNULL;for(i=n-1;i≥1;i--){p(NODE*)malloc(sizeof(NODE));scanf(ai);數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第16頁。p->dataai;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第16頁。p->nextq;qp;}return(p);}有一個(gè)單鏈表(不同結(jié)點(diǎn)的數(shù)據(jù)域值可能相同),其頭指針為head,編寫一個(gè)函數(shù)計(jì)算數(shù)據(jù)域?yàn)閤的結(jié)點(diǎn)個(gè)數(shù)。鏈表節(jié)點(diǎn)結(jié)構(gòu)定義如下:datanext解:遍歷該鏈表的每個(gè)結(jié)點(diǎn),每遇到一個(gè)結(jié)點(diǎn),判斷其值是否為x,是的話就計(jì)數(shù)。結(jié)點(diǎn)個(gè)數(shù)存儲在變量n中。算法如下:intCounter(head,x)
{
intn=0;
p<=head;
while(p!=NULL)
{
if(p->data=x)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第17頁。n<=n+1;
p<=p->next;
}
return(n);
}
數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第17頁。-------------------------------------------------------------------------------棧和隊(duì)列棧:限定僅在表尾進(jìn)行插入或刪除棧:是限定僅在表尾進(jìn)行插入或刪除操作的線性表表尾(棧頂)表頭(棧底)假設(shè)棧S=(a1,a2,…,an),則稱a1為棧底元素,an為棧頂元素。棧中元素按a1,a2,…,an的次序進(jìn)棧,退棧的第一元素應(yīng)為棧頂元素。換句話說,棧的修改是按后進(jìn)先出的原則進(jìn)行的。因此,棧又稱為后進(jìn)后出的線性表。壓棧算法:intPushStack(s[],top,x){ if(top>=SMAX) { printf("overlow");數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第18頁。 return0;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第18頁。 } else { S[top]<=x; top=top++; }}出棧算法:ElemTypePopstack(s[],top,bottom){ if(top<=bottom) { printf("overlow"); } return0; } else { top<=top-1; y<=S[top];數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第19頁。 returny;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第19頁。 }作業(yè)2:為了節(jié)省空間,兩個(gè)棧共享一段內(nèi)存,寫出這兩個(gè)棧的壓棧及出棧算法。為了增加內(nèi)存空間的利用率和減少溢出的可能性,由兩個(gè)棧共享一片連續(xù)地內(nèi)存空間時(shí),應(yīng)將兩棧的棧底,分別設(shè)在這片內(nèi)存空間的兩端,這樣,當(dāng)兩個(gè)棧的棧頂在??臻g的某一位置相遇時(shí),才會產(chǎn)生上溢。兩個(gè)棧共享空間的條件:兩棧頂指針值相減的絕對值為1(兩棧頂指針相鄰)數(shù)組Q[0..n-1]作為一個(gè)環(huán)形隊(duì)列,f為當(dāng)前隊(duì)頭元素的前一位置,r為隊(duì)尾元素的位置,假定隊(duì)列中元素的個(gè)數(shù)總小于n,計(jì)算隊(duì)列中元素個(gè)數(shù)的公式是(n+r-f)mod隊(duì)列特點(diǎn):先進(jìn)先出,隊(duì)頭出,隊(duì)尾進(jìn),當(dāng)隊(duì)尾大于隊(duì)頭時(shí),說明進(jìn)的比出的多,此時(shí)元素個(gè)數(shù)為Rear–Front循環(huán)隊(duì)列用數(shù)組A[0..m-1]存放其元素值,已知其頭尾指針分別是front和rear,則當(dāng)前隊(duì)列中的元素個(gè)數(shù)是(rear-front+m)MODm循環(huán)隊(duì)列兩指針front指示隊(duì)列頭元素位置rear指示隊(duì)列尾元素位置初始化建空隊(duì)列時(shí),令front=rear=0,插入新的尾元素->尾指針+1;刪除隊(duì)列頭元素->頭指針+1數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第20頁。頭指針始終指向隊(duì)列頭元素?cái)?shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第20頁。尾指針始終指向隊(duì)列尾指針的下一個(gè)位置在棧滿的情況下,不能作進(jìn)棧運(yùn)算,否則產(chǎn)生“上溢”。隊(duì)列:1.什么是隊(duì)列?也是一種特殊的線性表(插入在表的一端,刪除在表的另一端)隊(duì)列:先進(jìn)先出數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第21頁。區(qū)別于線性表:插入、刪除在同一端。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第21頁。2.隊(duì)列的操作:1.插入。判別隊(duì)列空間“空”或“滿”a.另設(shè)一個(gè)標(biāo)志位以區(qū)別隊(duì)列“空”或“滿”b.少用一個(gè)元素空間,約定以“隊(duì)列頭指針在隊(duì)列尾指針的下一個(gè)位置(指環(huán)狀的下一位置)”上作為隊(duì)列呈“滿”狀態(tài)的標(biāo)志總結(jié):若Rear>Front,元素個(gè)數(shù)為Rear-Front;若Rear<Front,元素個(gè)數(shù)為(Rear-Front+N)%N(N為隊(duì)列容量)如何判斷其滿?intQueueInsert(Q[],front,rear,x){ if(rear>=QMAX) { printf("Overlow");數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第22頁。 return0;數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第22頁。 } else { rear=rear+1; Q[rear]<=x; return1; }}2.刪除:ElemTypeQueueDelete(Q[],front,rear){ if(rear<=front) { printf("Overlow"); return0; } else { front=front+1; }}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第23頁。以上為錯(cuò)誤算法,rear<QMAX才能插入,空隊(duì)列:rear=front指針重疊“假滿”∵刪除/插入一次無事,N次則無用了。插入滿了只能刪除,rear、front均在尾,插入為滿,刪除為空∴成為了無用隊(duì)列。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第23頁。正確的隊(duì)列插入與刪除算法如下:intQueueInsert(Q[],front,rear,x){ if((rear+1)modQMAX=front) { printf("Overlow"); return0; } else { modQMAX數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第24頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第24頁。 return1; }}ElemTypeQueueDelete(Q[],front,rear){ if(rear<=front) { printf("Overlow"); return0; } else { modQMAX }3.隊(duì)列的應(yīng)用keyboardbuffer32byte如何解決“假滿”?---------還有空的地方卻不能再插入。答:接為環(huán)狀(上彎下彎不同)總結(jié):優(yōu)點(diǎn):1.不要求連續(xù)的、大塊的內(nèi)存,充分地利用內(nèi)存空間 2.動態(tài)的存儲結(jié)構(gòu)不足:1.空間復(fù)雜度增加數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第25頁。2.操作(算法)復(fù)雜些數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第25頁。雙端隊(duì)列:限定插入和刪除操作在表的兩端進(jìn)行的線性表。這兩端分別是端點(diǎn)1和端點(diǎn)2。在實(shí)際使用中,還可以有輸出受限的雙端隊(duì)列(即一個(gè)端點(diǎn)允許插入和刪除,另一個(gè)端點(diǎn)只允許插入的雙端隊(duì)列)和輸入受限的雙端隊(duì)列(即一個(gè)端點(diǎn)允許插入和刪除,另一個(gè)端點(diǎn)只允許刪除的雙端隊(duì)列)。而如果限定雙端隊(duì)列從某個(gè)端點(diǎn)插入的元素只能從該端點(diǎn)刪除,則該雙端隊(duì)列就蛻變成兩個(gè)棧底相鄰接的棧了。鏈隊(duì)列:用鏈表表示的隊(duì)列。-------------------------------------------------------------------------------數(shù)組和廣義表數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第26頁。從一給定的數(shù)組A[]中刪除元素值在x到y(tǒng)(x≤y)之間的所有元素(假定數(shù)組中有n個(gè)元素)。算法頭部約定如下:數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第26頁。voidDelete(A[],n,x,y)本題的算法思想是:先將A[]中所有元素值在x≤y之間的元素置成一個(gè)特殊的值(如0),并不立即刪除它們,然后從最后向前依次掃描,對于該特殊值的元素便移動其后面的元素將其刪除,這種算法比每刪除一個(gè)元素后立即移動其后元素效率要高一些。實(shí)現(xiàn)本題功能的過程如下:voidDelete(A[],n,x,y)
{
for(i1;i≤n;i++)if(A[i]≥x&&A[i]≤y)A[i]0;for(in;i≥1;i--)if(A[i]==0){for(kj;k≤(n-1);k++)A[k]A[k+1];nn-1;}}---------------------------------------------------------------------樹和二叉樹數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第27頁。設(shè)一棵Huffman樹中度為2的節(jié)點(diǎn)數(shù)為n2,則該樹的總節(jié)點(diǎn)數(shù)為2n2+1數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第27頁。度的概念:結(jié)點(diǎn)的度指結(jié)點(diǎn)的孩子結(jié)點(diǎn)個(gè)數(shù),例如度為2就是有2個(gè)孩子結(jié)點(diǎn)的結(jié)點(diǎn);葉子結(jié)點(diǎn)就是度為0的結(jié)點(diǎn),沒有孩子結(jié)點(diǎn)的結(jié)點(diǎn).按照這個(gè)概念,度為2的結(jié)點(diǎn)樹為n2,即為非葉子結(jié)點(diǎn),Huffman樹中葉子結(jié)點(diǎn)個(gè)數(shù)是非結(jié)點(diǎn)個(gè)數(shù)+1,所以總結(jié)點(diǎn)個(gè)數(shù):n2+n2+1有一棵非空的二叉樹(第0層為根結(jié)點(diǎn)),其第i層上至多有2i個(gè)結(jié)點(diǎn)。對于n個(gè)節(jié)點(diǎn)的滿二叉樹,設(shè)葉節(jié)點(diǎn)數(shù)為m,分枝節(jié)點(diǎn)數(shù)為k,則n=k+m滿二叉樹中,除了葉子結(jié)點(diǎn),就是分支結(jié)點(diǎn)。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第28頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第28頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第29頁。將一棵樹轉(zhuǎn)換為二叉樹表示后,該二叉樹的根結(jié)點(diǎn)沒有右子樹。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第29頁。已知完全二叉樹的第八層有8個(gè)結(jié)點(diǎn),則其葉子結(jié)點(diǎn)數(shù)是68。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第30頁。注意是根結(jié)點(diǎn)為第1層,第7層該有26=64個(gè)結(jié)點(diǎn),第八層有8個(gè)結(jié)點(diǎn)用去第7層的4個(gè)結(jié)點(diǎn),所以葉子結(jié)點(diǎn)總數(shù):64-4+8=68。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第30頁。葉子的帶權(quán)路徑長度=權(quán)值*路徑長度數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第31頁。樹的帶權(quán)路徑長度=所有葉子結(jié)點(diǎn)的帶權(quán)路徑長度之和數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第31頁。已知某二叉樹中,有n0個(gè)葉節(jié)點(diǎn),n1個(gè)度為1的節(jié)點(diǎn),n2個(gè)度為2的節(jié)點(diǎn)。則:n0=n2+1二叉樹采用順序存儲結(jié)構(gòu)(數(shù)組形式)和鏈?zhǔn)酱鎯Y(jié)構(gòu)(二叉鏈表)來存儲。高度為k的二叉樹至多有2^k-1個(gè)節(jié)點(diǎn)。二叉樹節(jié)點(diǎn)數(shù)目的算法。counter<=0;voidNumbers(NODE*tree)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第32頁。{數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第32頁。if(tree){counter++;Numbers(tree->Lsubtree);Numbers(tree->Rsubtree);}}設(shè)二叉樹的根節(jié)點(diǎn)的指針為tree,每個(gè)節(jié)點(diǎn)的結(jié)構(gòu)為:LsubtreedataRsubtree試寫一算法,用于輸出該二叉樹中最大的節(jié)點(diǎn)值。算法如下:max<=0;voidMaxNode(NODE*tree){if(tree){if(tree->data>max)max<=tree->data;MaxNode(tree->Lsubtree);MaxNode(tree->Rsubtree);}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第33頁。}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第33頁。或者:max<=0;voidMaxNode(NODE*tree){if(tree){x<=tree->data;y<=MaxNode(tree->Lsubtree);z<=MaxNode(tree->Rsubtree);reyurn(max(x,y,z));}elsereturn(-∞);}---------------------------------------------------------------------圖設(shè)有向圖G有n個(gè)頂點(diǎn),m條弧,則其鄰接表中鏈上的節(jié)點(diǎn)個(gè)數(shù)為m若一無向圖是連通的,且其中有n個(gè)頂點(diǎn)和e條邊,則必滿足e≥n-1數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第34頁。有向圖強(qiáng)連通分量在有向圖G中,如果兩個(gè)頂點(diǎn)vi,vj間(vi<>vj)有一條從vi到vj的有向路徑,同時(shí)還有一條從vj到vi的有向路徑,則稱兩個(gè)頂點(diǎn)強(qiáng)連通(stronglyconnected)。如果有向圖G的每兩個(gè)頂點(diǎn)都強(qiáng)連通,稱G是一個(gè)強(qiáng)連通圖。非強(qiáng)連通圖有向圖的極大強(qiáng)連通子圖,稱為強(qiáng)連通分量(stronglyconnectedcomponents)。記主要特征:強(qiáng)聯(lián)通分量圖中兩兩都可達(dá),也可見下圖實(shí)例。按照這個(gè)定義,得到圖G中的強(qiáng)聯(lián)通分量共3個(gè):<1,2>,<3,5,6>,<4>數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第34頁。在一個(gè)有n(n≥1)個(gè)頂點(diǎn)的有向圖中,邊數(shù)最多為n(n-1)帶權(quán)有向圖G用鄰接矩陣A存儲,則頂點(diǎn)i的入度等于A中第i列非∞且非O的元素個(gè)數(shù)有向圖中,結(jié)點(diǎn)i的入度就是指向i結(jié)點(diǎn)的弧的條數(shù),而鄰接矩陣是行數(shù)據(jù)中非0非無窮元素個(gè)數(shù)為i的出度,列才為入度有向圖用鄰接矩陣表示后,頂點(diǎn)i的出度等于第i行中非0且非∞的元素個(gè)數(shù)。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第35頁。圖的深度優(yōu)先和廣度優(yōu)先都要弄清楚。深度優(yōu)先為相連訪問(注意退回到還有連接結(jié)點(diǎn)沒有訪問過的那個(gè)結(jié)點(diǎn)上,廣度優(yōu)先為層次訪問,先訪問的結(jié)點(diǎn)其子樹也先訪問(子樹訪問無次序,僅對下層訪問有影響)數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第35頁。廣度優(yōu)先和深度優(yōu)先遍歷序列均可能是不唯一的。---------------------------------------------------------------------查找數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第36頁。折半查找算法。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第36頁。intBinSearch(sqlistr,intk,intn){low1;highn;find0;while(low≤highandnotfind){mid(low+high)/2;if(k<r[mid].key)highmid-1;elseif(k>r[mid].key)lowmid+1;else{imid;find1;}}if(notfind)i0;return(i);}數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第37頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第37頁。折半查找法使用于存儲結(jié)構(gòu)為順序存儲且按關(guān)鍵字排好序的線性表。在索引順序表上實(shí)現(xiàn)分塊查找,在等概率查找情況下,其平均查找長度不僅與表的個(gè)數(shù)有關(guān),而且與每一塊中的元素個(gè)數(shù)有關(guān)。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第38頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第38頁。---------------------------------------------------------------------排序在已知待排序文件已基本有序的前提下,效率最高的排序方法是直接插入排序考排序的效率和特點(diǎn):數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第39頁。一、插入排序(InsertionSort)
1.基本思想:
每次將一個(gè)待排序的數(shù)據(jù)元素,插入到前面已經(jīng)排好序的數(shù)列中的適當(dāng)位置,使數(shù)列依然有序;直到待排序數(shù)據(jù)元素全部插入完為止。
2.排序過程:
【示例】:
[初始關(guān)鍵字][49]38659776132749
J=2(38)[3849]659776132749
J=3(65)[384965]9776132749
J=4(97)[38496597]76132749
J=5(76)[3849657697]132749
J=6(13)[133849657697]2749
J=7(27)[13273849657697]49
J=8(49)[1327384949657697]
二、選擇排序
1.基本思想:
每一趟從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,順序放在已排好序的數(shù)列的最后,直到全部待排序的數(shù)據(jù)元素排完。
2.排序過程:
【示例】:
初始關(guān)鍵字[4938659776132749]
第一趟排序后13[38659776492749]
第二趟排序后1327[659776493849]
第三趟排序后132738[9776496549]
第四趟排序后13273849[49976576]
數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第40頁。第五趟排序后1327384949[979776]
第六趟排序后132738494976[7697]
第七趟排序后13273849497676[97]
最后排序結(jié)果1327384949767697
三、冒泡排序(BubbleSort)
1.基本思想:
兩兩比較待排序數(shù)據(jù)元素的大小,發(fā)現(xiàn)兩個(gè)數(shù)據(jù)元素的次序相反時(shí)即進(jìn)行交換,直到?jīng)]有反序的數(shù)據(jù)元素為止。
2.排序過程:
設(shè)想被排序的數(shù)組R[1..N]垂直豎立,將每個(gè)數(shù)據(jù)元素看作有重量的氣泡,根據(jù)輕氣泡不能在重氣泡之下的原則,從下往上掃描數(shù)組R,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮",如此反復(fù)進(jìn)行,直至最后任何兩個(gè)氣泡都是輕者在上,重者在下為止。
【示例】:
4913131313131313
3849272727272727
6538493838383838
9765384949494949
7697654949494949
1376976565656565
2727769776767676
數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第41頁。4949497697979797
四、快速排序(QuickSort)
1.基本思想:
在當(dāng)前無序區(qū)R[1..H]中任取一個(gè)數(shù)據(jù)元素作為比較的"基準(zhǔn)"(不妨記為X),用此基準(zhǔn)將當(dāng)前無序區(qū)劃分為左右兩個(gè)較小的無序區(qū):R[1..I-1]和R[I+1..H],且左邊的無序子區(qū)中數(shù)據(jù)元素均小于等于基準(zhǔn)元素,右邊的無序子區(qū)中數(shù)據(jù)元素均大于等于基準(zhǔn)元素,而基準(zhǔn)X則位于最終排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),當(dāng)R[1..I-1]和R[I+1..H]均非空時(shí),分別對它們進(jìn)行上述的劃分過程,直至所有無序子區(qū)中的數(shù)據(jù)元素均已排序?yàn)橹埂?/p>
2.排序過程:
【示例】:
初始關(guān)鍵字[4938659776132749]
第一次交換后[2738659776134949]
第二次交換后[2738499776136549]
J向左掃描,位置不變,第三次交換后[2738139776496549]
I向右掃描,位置不變,第四次交換后[2738134976976549]
J向左掃描[2738134976976549]
(一次劃分過程)
初始關(guān)鍵字[4938659776132749]
數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第42頁。一趟排序之后[273813]49[76976549]
二趟排序之后[13]27[38]49[4965]76[97]
三趟排序之后1327384949[65]7697
最后的排序結(jié)果1327384949657697
各趟排序之后的狀態(tài)
五、堆排序(HeapSort)
1.基本思想:
堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順序存儲結(jié)構(gòu),利用完全二叉樹中雙親結(jié)點(diǎn)和孩子結(jié)點(diǎn)之間的內(nèi)在關(guān)系來選擇最小的元素。
2.堆的定義:N個(gè)元素的序列K1,K2,K3,...,Kn.稱為堆,當(dāng)且僅當(dāng)該序列滿足特性:
Ki≤K2iKi≤K2i+1(1≤I≤[N/2])
堆實(shí)質(zhì)上是滿足如下性質(zhì)的完全二叉樹:樹中任一非葉子結(jié)點(diǎn)的關(guān)鍵字均大于等于其孩子結(jié)點(diǎn)的關(guān)鍵字。例如序列10,15,56,25,30,70就是一個(gè)堆,它對應(yīng)的完全二叉樹如上圖所示。這種堆中根結(jié)點(diǎn)(稱為堆頂)的關(guān)鍵字最小,我們把它稱為小根堆。反之,若完全二叉樹中任一非葉子結(jié)點(diǎn)的關(guān)鍵字均大于等于其孩子的關(guān)鍵字,則稱之為大根堆。
3.排序過程:
堆排序正是利用小根堆(或大根堆)來選取當(dāng)前無序區(qū)中關(guān)鍵字?。ɑ蜃畲螅┑臄?shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第43頁。記錄實(shí)現(xiàn)排序的。我們不妨利用大根堆來排序。每一趟排序的基本操作是:將當(dāng)前無序區(qū)調(diào)整為一個(gè)大根堆,選取關(guān)鍵字最大的堆頂記錄,將它和無序區(qū)中的最后一個(gè)記錄交換。這樣,正好和直接選擇排序相反,有序區(qū)是在原記錄區(qū)的尾部形成并逐步向前擴(kuò)大到整個(gè)記錄區(qū)。
【示例】:對關(guān)鍵字序列42,13,91,23,24,16,05,88建堆
對于已排好序的、具有12個(gè)數(shù)據(jù)元素的線性表,采用冒泡排序方法排序時(shí)最少需要11比較。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第39頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第40頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第41頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第42頁。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第43頁。冒泡排序法:For(i=0;i<n-1;i++)For(j=0;j<n-1-I;j++)If(a[j]>a[j+1]則交換優(yōu)化一下冒泡排序法Intf=0;For(i=0;i<n-1;i++){For(j=0;j<n-1-I;j++)If(a[j]>a[j+1])則{F=1;交換}if(!f)break;//如果第一趟排序,發(fā)現(xiàn)已經(jīng)是有序,則退出了,只比較了第一趟的11次
}只有在初始數(shù)據(jù)為逆序時(shí),冒泡排序所執(zhí)行的比較次數(shù)最多。數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第44頁。冒泡排序在最壞情況是初始序列為“逆序”,需要進(jìn)行N-1次排序,進(jìn)行的比較次數(shù)為:∑(i-1),下標(biāo)從n到2,即n(n-1)/2.數(shù)據(jù)結(jié)構(gòu)知識點(diǎn)總結(jié)-全文共47頁,當(dāng)前為第44頁。簡單選擇排序算法,效率不高voidSelectSort(intr[],intn)
{
for(i1;i≤n-1;i++)
for(ji+1;j≤n;j++)
if(r[j]<r[k
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ct室裝修合同范例
- 培訓(xùn)機(jī)構(gòu)正規(guī)合同模板
- 商鋪工程維修合同模板
- 床鋪合同范例
- 農(nóng)村樹木采購合同范例
- 廣告燈箱裝飾合同范例
- 與國外合同范例
- 2024年??隈{駛員客運(yùn)從業(yè)資格證模擬考試題庫答案
- 2024年牡丹江客運(yùn)從業(yè)資格證考試模板
- 2024年西藏駕校客運(yùn)從業(yè)資格證模擬考試題庫
- 工業(yè)產(chǎn)品CAD技能三級試題及其評分標(biāo)準(zhǔn)
- 多元統(tǒng)計(jì)分析習(xí)題及解答
- 國家開放大學(xué)電大公共行政學(xué)形考任務(wù)1-3答案(全)
- 漢語詞性專題練習(xí)(附答案)
- 勞動合同-高管補(bǔ)充協(xié)議20110520
- 新北師大版九年級上冊英語(全冊知識點(diǎn)語法考點(diǎn)梳理、重點(diǎn)題型分類鞏固練習(xí))(家教、補(bǔ)習(xí)、復(fù)習(xí)用)
- 浙江省溫州市地圖矢量PPT模板(圖文)
- 上海市建設(shè)工程項(xiàng)目管理機(jī)構(gòu)管理人員情況表
- 北師大版二年級數(shù)學(xué)上冊第九單元《除法》知識點(diǎn)梳理復(fù)習(xí)ppt
- 空氣能室外機(jī)保養(yǎng)維護(hù)記錄表
- DB37∕T 5162-2020 裝配式混凝土結(jié)構(gòu)鋼筋套筒灌漿連接應(yīng)用技術(shù)規(guī)程
評論
0/150
提交評論