數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--兩種常用查找算法的比較與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  兩種常用查找算法的</b></p><p><b>  比較與實(shí)現(xiàn)</b></p><p>  摘 要:本次課程設(shè)計(jì)主要研究幾種常用查找算法的比較與實(shí)現(xiàn),查找的算法有很多種:靜態(tài)查找表的順序表、有序表、索引順序表等查找結(jié)構(gòu);動(dòng)態(tài)查找表的二叉排序樹(shù)、哈希查找等查找結(jié)構(gòu)。本次的課程設(shè)計(jì)主要研究?jī)煞N常見(jiàn)的查找算法:順序查找

2、和折半查找,分析比較它們的時(shí)間復(fù)雜度,并且在此基礎(chǔ)上用C語(yǔ)言對(duì)它們進(jìn)行算法編程、調(diào)試和運(yùn)行。</p><p>  關(guān)鍵詞:C語(yǔ)言;順序查找;折半查找;時(shí)間復(fù)雜度。</p><p><b>  引 言</b></p><p>  “數(shù)據(jù)結(jié)構(gòu)”在計(jì)算機(jī)科學(xué)中是一門(mén)綜合性的專(zhuān)業(yè)基礎(chǔ)課,“數(shù)據(jù)結(jié)構(gòu)”的研究不僅涉及到計(jì)算機(jī)硬件的研究范圍,而且和計(jì)算機(jī)軟件

3、的研究有著密切的關(guān)系無(wú)論是編譯程序還是操作系統(tǒng),都涉及到數(shù)據(jù)元素在存儲(chǔ)器中的分配問(wèn)題。在研究信息檢索時(shí)也必須考慮如何組織數(shù)據(jù),一遍查找和存取數(shù)據(jù)元素更為方便。因此,可以認(rèn)為“數(shù)據(jù)結(jié)構(gòu)”是介于數(shù)學(xué)、計(jì)算機(jī)硬件和計(jì)算機(jī)軟件三者之間的一門(mén)核心課程。</p><p>  課程設(shè)計(jì)是我們專(zhuān)業(yè)課程知識(shí)綜合應(yīng)用的實(shí)踐訓(xùn)練,是實(shí)踐性教學(xué)的一個(gè)重要環(huán)節(jié)。而數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計(jì),更要求學(xué)生在數(shù)據(jù)結(jié)構(gòu)的邏輯特性和物理表示、數(shù)據(jù)結(jié)構(gòu)的選擇

4、和應(yīng)用、算法的設(shè)計(jì)及其實(shí)現(xiàn)等方面,加深對(duì)課程基本內(nèi)容的理解。同時(shí),在程序設(shè)計(jì)方法以及上機(jī)操作等基本技能和科學(xué)作風(fēng)方面受到比較系統(tǒng)和嚴(yán)格的訓(xùn)練。</p><p>  在日常生活中,人們幾乎每天都要進(jìn)行“查找”工作。例如,在電話號(hào)碼薄中查閱“某單位”或“某人”的電話號(hào)碼;在字典中查閱“某個(gè)詞”的讀音和含義等等。而同樣地,在各種系統(tǒng)軟件和應(yīng)用軟件中,也存在“查找”:如編譯程序中符號(hào)表、信息處理表中相關(guān)信息的查找。所以,

5、“查找”就是在一個(gè)含有眾多的數(shù)據(jù)元素(或記錄)的查找表中找出某個(gè)“特定的”數(shù)據(jù)元素(或記錄)【1】。</p><p>  在計(jì)算機(jī)中進(jìn)行查找的方法也會(huì)隨數(shù)據(jù)結(jié)構(gòu)不同而不同。在此,引入“查找表”的概念:同類(lèi)數(shù)據(jù)元素構(gòu)成的集合。所以,這次的課程設(shè)計(jì)就可以從靜態(tài)查找表的幾種典型的算法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)元素的查找的算法和操作的實(shí)現(xiàn)和比較。</p><p><b>  1.1課程設(shè)計(jì)背景<

6、/b></p><p>  《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)作為獨(dú)立的教學(xué)環(huán)節(jié),是計(jì)算機(jī)相關(guān)專(zhuān)業(yè)集中實(shí)踐環(huán)節(jié)系列之一,是學(xué)習(xí)完《數(shù)據(jù)結(jié)構(gòu)》課程后進(jìn)行的一次全面的綜合練習(xí)。所以需要我們了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計(jì)方法,并且具備初步的獨(dú)立分析和設(shè)計(jì)能力,同時(shí)要掌握軟件開(kāi)發(fā)過(guò)程的問(wèn)題分析、系統(tǒng)設(shè)計(jì)、程序編碼測(cè)試等基本方法和技能,提高綜合運(yùn)用所學(xué)的理論知識(shí)和方法獨(dú)立分析和解決問(wèn)題的能力。所以這次課程設(shè)計(jì)的目的在于:加強(qiáng)學(xué)生對(duì)

7、C語(yǔ)言的基本知識(shí)和技能;加深對(duì)數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)理論和基本知識(shí)的理解,提高解決實(shí)際問(wèn)題的實(shí)踐能力;同時(shí)幫助調(diào)動(dòng)學(xué)生的積極性和能動(dòng)性,培養(yǎng)學(xué)生的自學(xué)、動(dòng)手能力。</p><p>  1.2課程設(shè)計(jì)目標(biāo)</p><p>  本次課程設(shè)計(jì),我準(zhǔn)備用不同的兩種常見(jiàn)的查找方法:針對(duì)順序查找表中查找方法,如順序查找、折半查找等。并且通過(guò)用這些算法實(shí)現(xiàn)對(duì)某個(gè)“特定的”數(shù)據(jù)元素(關(guān)鍵字)的查找,分析這些操作的

8、性能:它們各自的時(shí)間復(fù)雜度、空間復(fù)雜度和其它的一些性能,同時(shí)記錄每種查找方法的優(yōu)缺點(diǎn),比較得出它們的查找效率和查找范圍。</p><p><b>  2 設(shè)計(jì)概要</b></p><p><b>  2.1 問(wèn)題描述</b></p><p>  對(duì)于不同的查找算法,它們各自的時(shí)間復(fù)雜度和空間復(fù)雜度不同,查找的思想和算法也

9、明顯不同,所以要分析它們的特點(diǎn)和效率,我們要多方面比較:要比較時(shí)間復(fù)雜度,我們可以從它們的查找長(zhǎng)度側(cè)面比較出來(lái);而它們算法的實(shí)現(xiàn)就要熟悉它們的查找思想,熟練應(yīng)用C語(yǔ)言編寫(xiě)合適的程序。</p><p><b>  2.2 設(shè)計(jì)思路</b></p><p>  靜態(tài)查找表有順序表和鏈?zhǔn)奖韮煞N表示方法,在這次的課程設(shè)計(jì)里,我用順序存儲(chǔ)表來(lái)表示這兩種查找算法的程序。</

10、p><p>  我的設(shè)計(jì)思路及步驟如下:</p><p> ?。?)熟悉兩種算法的編程思想,畫(huà)出流程圖。</p><p> ?。?)先編寫(xiě)兩種算法的子程序,再遍寫(xiě)主程序調(diào)用它們。</p><p> ?。?)分步調(diào)試子程序和主程序,直到不再出現(xiàn)錯(cuò)誤,然后運(yùn)行程序,檢查是否和自己當(dāng)初的設(shè)想一樣,一直到結(jié)果能讓自己滿意。</p><

11、;p> ?。?)比較得出兩種查找算法的優(yōu)缺。</p><p>  2.3 相關(guān)的知識(shí)點(diǎn)</p><p> ?。?)C語(yǔ)言表示靜態(tài)查找表的順序存儲(chǔ)結(jié)構(gòu)</p><p>  typedef struct {</p><p>  ElemType *elem; //數(shù)據(jù)元素存儲(chǔ)空間基址,建表時(shí)按實(shí)際長(zhǎng)度分配,0號(hào)單元留空</p&g

12、t;<p>  int length; //表的長(zhǎng)度</p><p>  } SSTable; </p><p> ?。?)查找算法的衡量指標(biāo)</p><p>  查找可能產(chǎn)生“成功”與“不成功”兩種結(jié)果,但在實(shí)際應(yīng)用的大多數(shù)情況下,查找成功的可能性比不成功的可能性大得多,特別是在記錄數(shù)中n很大時(shí),查找不成功的概率可以忽略不計(jì)。當(dāng)查找不

13、成功的情況不能忽視時(shí),查找算法的平均長(zhǎng)度應(yīng)該是查找成功時(shí)的平均查找長(zhǎng)度與查找不成功時(shí)的平均查找長(zhǎng)度之和,平均查找長(zhǎng)度為:</p><p><b>  ASL= </b></p><p>  其中,n為元素的個(gè)數(shù); ci是查找第i 個(gè)記錄需進(jìn)行的比較次數(shù);pi是查找第i個(gè)記錄的概率,一般可認(rèn)為查找每個(gè)記錄的概率是相等的,即p1=p2=…=pn=1/n【2】。</

14、p><p>  3 算法分析及程序編寫(xiě)</p><p>  3.1.順序表的查找</p><p><b>  基本思想</b></p><p>  從查找表的一端開(kāi)始,逐個(gè)將記錄的關(guān)鍵字值和給定值進(jìn)行比較,如果某個(gè)記錄的關(guān)鍵字值和給定值相等,則稱(chēng)查找成功;否則,說(shuō)明查找表中不存在關(guān)鍵字值為給定值的記錄,則稱(chēng)查找失敗。<

15、/p><p> ?。?)順序查找算法流程圖</p><p>  算法流程圖如圖3-1所示:</p><p>  圖3-1:順序查找算法流程圖</p><p>  (3)順序查找算法代碼如下</p><p>  int Search_Seq(SSTable *table, ElemType key)</p>&

16、lt;p>  { /*在順序表ST中順序查找其關(guān)鍵字等于key的數(shù)據(jù)元素。若找到,則函數(shù)值為該元素在表中的位置,否則為零。*/</p><p>  table->elem[0]=key; //設(shè)置哨兵</p><p>  int result=0; // 找不到時(shí),返回0</p><p><b&

17、gt;  int i;</b></p><p>  for (i=table->length; i>=1;i--) </p><p>  { //從后往前找</p><p>  if (table->elem[i]==key) </p><p><b>  {</b>

18、</p><p>  result=i; //找到關(guān)鍵字的時(shí)候,該元素的位置</p><p>  break; </p><p><b>  }</b></p><p><b>  } </b></p><p>  return result; //找不到

19、時(shí)返回</p><p><b>  }</b></p><p>  <4>順序查找算法性能分析</p><p>  對(duì)于順序查找,不論給定值key為何值,查找不成功時(shí)和給定值進(jìn)行比較的關(guān)鍵字個(gè)數(shù)均為n+1.假設(shè)查找成功與不成功的可能性相同,對(duì)每個(gè)記錄的查找概率也相等,則Pi=1/(2n),此時(shí)順序查找的平均查找長(zhǎng)度為[3]:<

20、/p><p>  ASL= +(1/2)(n+1)</p><p>  =(3/4)(n+1)</p><p><b>  <5>結(jié)論</b></p><p>  順序查找的優(yōu)點(diǎn)是算法簡(jiǎn)單,且對(duì)表的結(jié)構(gòu)沒(méi)有任何要求。它的缺點(diǎn)是查找效率低,因此,當(dāng)表中元素個(gè)數(shù)比較多時(shí),不宜采用順序查找。 </p>

21、<p><b>  3.2.折半查找</b></p><p> ?。?)使用折半查找必須具備兩個(gè)前提條件</p><p>  a:要求查找表中的記錄按關(guān)鍵字有序(假設(shè):從小到大有序)</p><p>  b:只能適用于順序存儲(chǔ)結(jié)構(gòu) </p><p><b>  (2)基本思想</b>&

22、lt;/p><p>  先取查找表的中間位置的關(guān)鍵字值與給定關(guān)鍵字值作比較,若它們的值相等,則查找成功;如果給定值比該記錄的關(guān)鍵字值大,說(shuō)明要查找的記錄一定在查找表的后半部分,則在查找表的后半部分繼續(xù)使用折半查找;若給定值比該記錄的關(guān)鍵字值小,說(shuō)明要查找的記錄一定在查找表的前半部分,則在查找表的前半部分繼續(xù)使用折半查找,直到查找成功,或者查找失敗。</p><p><b>  (3)

23、查找流程圖</b></p><p>  流程圖如圖3-2所示:</p><p>  圖3-2:折半查找算法流程圖</p><p>  (4)折半查找算法的代碼</p><p>  int Search_Bin(SSTable *table, ElemType key)</p><p>  {/*在有序表S

24、T中折半查找其關(guān)鍵字等于key的數(shù)據(jù)元素。若找到,則函數(shù)值為該元素在表中的位置,否則為0.*/</p><p>  int low=1;</p><p>  int high=table->length; //置區(qū)間初值</p><p>  int result=0; // 找不到時(shí),返回0</p><p>  wh

25、ile(low <= high)</p><p><b>  {</b></p><p>  int mid=(low+high)/2; //中間的數(shù)據(jù)元素</p><p>  if(table->elem[mid]==key)</p><p><b>  {</b></

26、p><p>  result=mid;</p><p><b>  break;</b></p><p>  } //找到待查元素</p><p>  else if(key<table->elem[mid])</p><p><b>  {&l

27、t;/b></p><p>  high=mid-1;</p><p>  } //繼續(xù)在前半?yún)^(qū)間進(jìn)行查找</p><p><b>  else</b></p><p><b>  {</b></p><p>  low=mid+1;</p>

28、<p>  } //繼續(xù)在后半?yún)^(qū)間進(jìn)行查找</p><p><b>  }</b></p><p>  return result;</p><p><b>  }[5]</b></p><p> ?。?)折半查找算法性能分析</p><p>  在

29、折半查找的過(guò)程中,每經(jīng)過(guò)一次比較,查找范圍都要縮小一半,所以折半查找的最大查找長(zhǎng)度為</p><p>  MSL=[log2 n]+1</p><p>  當(dāng)n足夠大時(shí),可近似的表示為log2(n)。</p><p><b> ?。?)結(jié)論</b></p><p>  折半查找要求查找表按關(guān)鍵字有序,而排序是一種很費(fèi)時(shí)的

30、運(yùn)算;另外,折半查找要求表是順序存儲(chǔ)的,為保持表的有序性,在進(jìn)行插入和刪除操作時(shí),都必須移動(dòng)大量記錄。因此,折半查找的高查找效率是以犧牲排序?yàn)榇鷥r(jià)的,它特別適合于一經(jīng)建立就很少移動(dòng)、而又經(jīng)常需要查找的線性表。</p><p>  可見(jiàn)在查找速度上,折半查找比順序查找速度要快的多,這是它的主要優(yōu)點(diǎn)[4]。 </p><p><b>  4 測(cè)試分析</b></p

31、><p><b>  輸入元素有誤</b></p><p>  (1):若輸入的元素個(gè)數(shù)不合理,元素個(gè)數(shù)少于n,這種輸入造成的的結(jié)果是系統(tǒng)一直等待元素的輸入,即得不到結(jié)果。如圖4-1所示:</p><p>  圖4-1:輸入元素個(gè)數(shù)少時(shí)的運(yùn)行情況</p><p> ?。?)若輸入元素個(gè)數(shù)大于n時(shí),系統(tǒng)將從第一個(gè)元素起,自動(dòng)選

32、取前n個(gè)元素作為有效元素,進(jìn)行程序的后續(xù)運(yùn)行。這種情況下的結(jié)果如圖4-2所示:</p><p>  圖4-2:輸入元素個(gè)數(shù)多時(shí)的運(yùn)行情況</p><p><b>  查找失敗</b></p><p>  這種情況是指在n個(gè)元素中沒(méi)有與關(guān)鍵字相同的元素存在,所以程序運(yùn)行的結(jié)果是查找失敗。運(yùn)行結(jié)果如圖4-3所示:</p><p&

33、gt;  圖4-3:查找失敗時(shí)的運(yùn)行情況</p><p><b>  查找成功</b></p><p>  若查找成功,即元素輸入無(wú)誤,且有關(guān)鍵字存在的情況,這個(gè)時(shí)候的運(yùn)行結(jié)果如圖4-4所示[5]:</p><p>  圖4-4:查找成功時(shí)的運(yùn)行情況</p><p><b>  5 總結(jié)和體會(huì)</b>

34、;</p><p>  5.1 課程設(shè)計(jì)總結(jié)</p><p>  “書(shū)到用時(shí)方恨少”。在這次課程設(shè)計(jì),我感觸最深的當(dāng)屬查閱大量的設(shè)計(jì)資料了,為了讓自己的設(shè)計(jì)更加完善,查閱這方面的設(shè)計(jì)資料是十分必要的,看著那么大疊的書(shū)籍、資料擺在自己的面前,有些時(shí)候還要上網(wǎng)查閱相關(guān)知識(shí)點(diǎn),并且還要整理出有用的知識(shí)點(diǎn),這對(duì)于我來(lái)說(shuō),是在是個(gè)不小的挑戰(zhàn)。所以,以后一定要多看自己專(zhuān)業(yè)方面的書(shū)籍,增長(zhǎng)自己的知識(shí)。而

35、且,寫(xiě)程序是一件十分需要耐心的活,一個(gè)不小心,后果就可能是幾個(gè)小時(shí)的思考和調(diào)試,幸好這次的課題我并不陌生,所以,并沒(méi)有自己想象中的艱難。但是,用的時(shí)間和精力卻絕對(duì)也不少。</p><p><b>  5.2 心得與體會(huì)</b></p><p>  這次課程設(shè)計(jì),使我對(duì)《數(shù)據(jù)結(jié)構(gòu)》這門(mén)課程有了更深入的了解?!稊?shù)據(jù)結(jié)構(gòu)》是一門(mén)實(shí)踐性較強(qiáng)的課程,為了學(xué)好這門(mén)課程,必須在掌握

36、理論知識(shí)的同時(shí),加強(qiáng)上機(jī)實(shí)踐。一個(gè)人的力量是有限的,要想把課程設(shè)計(jì)做的更好,就要學(xué)會(huì)參考一定的資料,吸取別人的經(jīng)驗(yàn),讓自己和別人的思想有機(jī)的結(jié)合起來(lái),得出屬于你自己的靈感。</p><p>  在本課程設(shè)計(jì)中,我明白了理論與實(shí)際應(yīng)用相結(jié)合的重要性,并提高了自己組織數(shù)據(jù)及編寫(xiě)大型程序的能力。培養(yǎng)了基本的、良好的程序設(shè)計(jì)技能以及合作能力。這次課程設(shè)計(jì)同樣提高了我的綜合運(yùn)用所學(xué)知識(shí)的能力。程序的編寫(xiě)需要有耐心,有些事情

37、看起來(lái)很復(fù)雜,但問(wèn)題需要一點(diǎn)一點(diǎn)去解決,分析問(wèn)題,把問(wèn)題一個(gè)一個(gè)劃分,劃分成小塊以后就逐個(gè)去解決。再總體解決大的問(wèn)題。這樣做起來(lái)不僅有條理也使問(wèn)題得到了輕松的解決。</p><p>  通過(guò)這兩周的課程設(shè)計(jì),我認(rèn)識(shí)到數(shù)據(jù)結(jié)構(gòu)是一門(mén)比較難的課程。需要多花時(shí)間上機(jī)練習(xí)。這次的程序訓(xùn)練培養(yǎng)了我實(shí)際分析問(wèn)題、編程和動(dòng)手能力,使我掌握了程序設(shè)計(jì)的基本技能,提高了我適應(yīng)實(shí)際,實(shí)踐編程的能力。</p><p

38、><b>  參考文獻(xiàn):</b></p><p>  [1]嚴(yán)蔚敏,吳偉民. 《數(shù)據(jù)結(jié)構(gòu):C語(yǔ)言版》 清華大學(xué)出版社,2012.5</p><p>  [2]Mark Allen Weiss.數(shù)據(jù)結(jié)構(gòu)與算法分析——C語(yǔ)言描述(英文版第二版).北京:人民郵電出版社,2005</p><p>  [3]李峰,謝中科.C語(yǔ)

39、言程序設(shè)計(jì).上海:復(fù)旦大學(xué)出版社,2011</p><p>  [4]Baloukas, C., Risco-Martin, J. L., Atienza, D., et al. Optimization methodology of dynamic data structures based on genetic algorithms for multimedia embedded systems[J]. Jo

40、urnal of Systems and Software, 2009, 82(4): 590-602.</p><p>  [5]李春葆,尹為民.數(shù)據(jù)結(jié)構(gòu)教程上機(jī)指導(dǎo)(第三版).北京:清華大學(xué)出版社,2008</p><p><b>  附錄:程序源代碼:</b></p><p>  #include<iostream></

41、p><p>  #include<stdlib.h></p><p>  #include<stdio.h></p><p>  using namespace std;</p><p>  typedef int ElemType ;</p><p>  //用C語(yǔ)言定義順序存儲(chǔ)結(jié)構(gòu) </

42、p><p>  typedef struct {</p><p>  ElemType *elem; //數(shù)據(jù)元素存儲(chǔ)空間基址,建表時(shí)按實(shí)際長(zhǎng)度分配,0號(hào)單元留空</p><p>  int length; //表的長(zhǎng)度</p><p>  } SSTable; </p><p>  void Creat

43、e(SSTable *table, int length); // 構(gòu)建順序表</p><p>  void Destroy(SSTable *table);</p><p>  int Search_Seq(SSTable *table, ElemType key);</p><p>  void Traverse(SSTable *table, voi

44、d (*visit)(ElemType elem));</p><p>  void Create(SSTable **table, int length)</p><p>  { // 構(gòu)建順序表</p><p>  SSTable *t = (SSTable*) malloc(sizeof(SSTable));</p><

45、;p>  t->elem=(ElemType*)malloc(sizeof(ElemType)*(length+1));</p><p>  t->length=length;</p><p><b>  *table=t;</b></p><p><b>  }</b></p><p

46、>  void FillTable(SSTable *table)</p><p>  { // 無(wú)序表的輸入 </p><p>  ElemType *t=table->elem;</p><p>  for(int i=0; i<table->length; i++)</p><p><b&g

47、t;  {</b></p><p><b>  t++;</b></p><p>  scanf("%d", t);</p><p>  getchar();</p><p><b>  }</b></p><p><b>  }&l

48、t;/b></p><p>  void Destroy(SSTable *table)</p><p>  { //銷(xiāo)毀表</p><p>  free(table->elem);</p><p>  free(table);</p><p><b>  }</b>&

49、lt;/p><p>  void PrintTable(SSTable *table)</p><p>  { // 打印查找表中的元素</p><p><b>  int i;</b></p><p>  ElemType *t=table->elem;</p><p>  

50、for(i=0; i<table->length; i++)</p><p><b>  {</b></p><p><b>  t++;</b></p><p>  printf("%d ", *t);</p><p><b>  }</b>&

51、lt;/p><p><b>  }</b></p><p>  //順序(哨兵)查找算法</p><p>  int Search_Seq(SSTable *table, ElemType key)</p><p>  { /*在順序表ST中順序查找其關(guān)鍵字等于key的數(shù)據(jù)元素。若找到,則函數(shù)值為該元素在表中的位置,否則

52、為零。*/</p><p>  table->elem[0]=key; //設(shè)置哨兵</p><p>  int result=0; // 找不到時(shí),返回0</p><p><b>  int i;</b></p><p>  for (i=table->le

53、ngth; i>=1;i--) </p><p>  { //從后往前找</p><p>  if (table->elem[i]==key) </p><p><b>  {</b></p><p>  result=i; //找到關(guān)鍵字的時(shí)候,該元素的位置</p>

54、<p>  break; </p><p><b>  }</b></p><p><b>  } </b></p><p>  return result; //找不到時(shí)返回</p><p><b>  }</b></p><p

55、>  void Sort(SSTable *table )</p><p>  { // 排序算法 </p><p><b>  int i, j;</b></p><p>  ElemType temp;</p><p>  for (i=table->length; i>=1 ;i-

56、-) // 從前往后找</p><p><b>  {</b></p><p>  for (j=1; j<i; j++)</p><p>  { </p><p>  if(table->elem[j]>table->elem[j+1])</p><p&

57、gt;  { //從小到大排列</p><p>  temp=table->elem[j];</p><p>  table->elem[j]=table->elem[j+1]; //元素后移</p><p>  table->elem[j+1]=temp;</p><p><b>  }<

58、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int Search_Bin(SSTable *table, ElemType key)</p><p

59、>  {/*在有序表ST中折半查找其關(guān)鍵字等于key的數(shù)據(jù)元素。若找到,則函數(shù)值為該元素在表中的位置,否則為0.*/</p><p>  int low=1;</p><p>  int high=table->length; //置區(qū)間初值</p><p>  int result=0; // 找不到時(shí),返回0</p>

60、<p>  while(low <= high)</p><p><b>  {</b></p><p>  int mid=(low+high)/2; //中間的數(shù)據(jù)元素</p><p>  if(table->elem[mid]==key)</p><p><b>  {

61、</b></p><p>  result=mid;</p><p><b>  break;</b></p><p>  } //找到待查元素</p><p>  else if(key<table->elem[mid])</p><p>

62、;<b>  {</b></p><p>  high=mid-1;</p><p>  } //繼續(xù)在前半?yún)^(qū)間進(jìn)行查找</p><p><b>  else</b></p><p><b>  {</b></p><p>  low=mi

63、d+1;</p><p>  } //繼續(xù)在后半?yún)^(qū)間進(jìn)行查找</p><p><b>  }</b></p><p>  return result;</p><p><b>  }</b></p><p><b>  // 主函數(shù) </b>

64、;</p><p>  int main(int argc, char* argv[])</p><p><b>  {</b></p><p>  SSTable *table;</p><p>  int r; //元素的位置</p><p><b>  intn;</b

65、></p><p>  ElemType key;</p><p>  printf("輸入 n:");</p><p>  scanf("%d",&n);</p><p>  Create(&table, n);//建立表</p><p>  cout&l

66、t;<"請(qǐng)輸入"<<n<<"個(gè)值"<<endl;</p><p>  FillTable(table);//輸入無(wú)序表的值</p><p>  printf("您輸入的 %d 個(gè)值是:\n",n);</p><p>  PrintTable(table);//打印無(wú)

67、序表</p><p>  cout<<endl;</p><p>  printf("請(qǐng)輸入關(guān)鍵字的值:\n");</p><p>  scanf("%d",&key);</p><p>  printf("順序法查找運(yùn)行結(jié)果如下:\n ");</p>

68、<p>  Search_Seq(table,key);//順序(哨兵)查找算法</p><p>  r=Search_Seq(table,key);</p><p>  if( r>0) </p><p>  printf(" 關(guān)鍵字 %d 在表中的位置是: %d\n",key, r);</p><p

69、><b>  else </b></p><p>  printf ("查找失敗,表中無(wú)此數(shù)據(jù)。\n"); </p><p>  Sort(table);//對(duì)無(wú)序表進(jìn)行排序</p><p>  printf("數(shù)據(jù)排序后的順序如下:\n ");</p><p>  P

70、rintTable(table);//打印有序表</p><p>  printf("\n");</p><p>  printf("折半查找法運(yùn)行結(jié)果如下:\n ");</p><p>  r=Search_Bin(table,key);//折半查找算法</p><p><b>  if(

71、r>0)</b></p><p>  printf(" 關(guān)鍵字 %d 在表中的位置是: %d\n",key, r);</p><p><b>  else {</b></p><p>  printf ("查找失敗,表中無(wú)此數(shù)據(jù)。\n");}</p><p>

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論