排序与搜寻.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
排序与搜寻

排序與搜尋 各種排序法簡介 bubble sort 氣泡排序法 書上最常見的排序法。每次都走過整個陣列,把相鄰兩個中較大(小)的放到後面。如此重複n次,就可以達到排序的目的。時間複雜度O(n2)。 selection sort 選擇排序法 這比上面的方法好些,每次走過整個陣列,把最大(小)的記錄下來;陣列走完後才和最後一個交換。一樣要重複n次,時間複雜度O(n2)。 insertion sort 插入排序法 就像你在整理撲克牌的時候,拿起一張,就把它放到正確的位置,然後再拿下一張…直到整理完畢。插入排序也是這樣,假設前n-1個已經排序完成,在插入第n個的時後,就只需要一個一個比較,找到適合的位置放進去。當然,在它後面的陣列元素必須先往後移一格空出空間。時間複雜度O(n2)。 以上三種排序法,是一般常見的,也是比較慢的排序法。 merge sort 合併排序法 這個方法是把一組資料平分為二,然後分別排序這兩組資料。如果這組資料只剩一個,就停止分割,同時,這組資料也排序完成了。等到這兩組分別排序完成,就把這兩組合併。由於兩邊已經分別排序,所以合併的時候最多只要比較N次,N是排序的總個數。時間複雜度O(n log2n),簡記為O(nlgn)。 quick sort 快速排序法 這個跟合併排序有點像,也是分成兩邊去排。不過分割的方法不一樣,合併排序是用位置去分,快速排序是用值的大小來分。所以合併排序的分割很快,但是最後還要做一個合併的動作;而快速排序只要分割好就是排好了,但是在分割的時候要做處理。處理的方法就是:選一個值當作分界點,把比這個值小的放到一邊,比它大的放到另一邊。快速排序的時間複雜度在一般狀況是O(nlgn),但最糟的狀況可以到O(n2)。(最糟狀況是每次選的分界點剛好都是極值) 以上舉的幾個都是經由比較與交換來完成排序,而這樣的時間複雜度下限為O(nlgn)。 counting sort 計數排序法 這個方法很簡單,就是計算每個數字各出現幾次,然後由小到大(或由大到小)把每個數字填回原本的陣列。時間複雜度O(n),但是如果數字很大的話會用很多記憶體。 補充:STL C++的STL有提供sort()函式,須先引入algorithm。用法如下: sort(陣列開頭指標, 陣列結束指標, 比較函式); 陣列開頭指標是陣列中要排序的第一個位置;陣列結束指標是陣列中要排序的最後一個位置的下一個位置,也就是說會被排序的是一個半開區間: []陣列開頭位置 , 陣列結束位置() 比較函式這一項可有可無,不過如果要排序的是自定的資料型態,那就一定要有。這個傳入的是一個函式名稱,而這個函式必須滿足:參數是兩個該資料型態的變數,傳回值是bool。如果傳回1,就表示第一個參數要排前面,傳會0就相反。如果沒有這項,就會以’’來做判定。 範例:sort(data, data+10); 搜尋 list的搜尋 ── Binary Search 每次我們要在陣列裡找東西的時候,都要把整個陣列走一次,很浪費時間。如果陣列是已經排序好的,其實只要花O(lgn)的時間就可以找到。 假設現在要在data[0~N]裡面找k,而data[]已經由小到大排序完成。先看看data[N/2]這個值,如果data[N/2]等於k,那很幸運的,我們找到了;如果data[N/2]大於k,那在data[N/2~N]裡面也不會有k,所以只要找data[0~N/2]裡面就好了;相反的,如果data[N/2]小於k,那也只要找data[N/2+1~N]。這樣每次砍掉一半,最多只要log2N次就可以找到所要的資料(或知道資料不存在)。 tree/graph的搜尋 當然,不是每種資料都可以像上面那樣簡單的排序搜尋,有些東西還是要一個一個嘗試,才知道對或不對。像是一般tree和graph結構,或是一些”遊戲”問題,就可能需要暴力解(就是try-error的做法啦),當然也有的問題會有很漂亮的解法,不過那些以後再說吧!先講兩種最常用的暴力法: DFS(Depth-First Search 深度優先搜尋) 顧名思義,深度優先,找到一條路就走下去,直到不能走了再回頭。這個方法的優點是程式好寫(只要一直遞迴下去就好),而且只要有解就一定找的到;缺點就是它比較慢,尤其是要找”最佳解”的時候,會花非常多時間(因為要找到每種解再去比較)。 常見的問題有:走迷宮,N-queen…… BFS(Breath-First Search 廣度優先搜尋) 跟上面相對,這個是廣度優先。也就是說如果有很多條路,就每一條先走一步,把行不通的刪掉,然後再走第二步,這樣進行下去直到找到答案為止。廣度優先在找”最佳解”的時候比深度優先快很多,因為BFS找到的第一個解就會是最佳解(想想看為什麼?)。 常見的問題有:迷宮最短路徑,

文档评论(0)

tangtianbao1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档