- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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找到的第一個解就會是最佳解(想想看為什麼?)。
常見的問題有:迷宮最短路徑,
您可能关注的文档
最近下载
- 用高倍显微镜观察叶绿体和细胞质流动实验.doc VIP
- 总账会计面试题目及答案.doc VIP
- 测绘安全生产事故报告及处置办法.docx VIP
- 最新版精选食品安全管理员完整题库298题(含答案) .pdf
- 造纸用压滤脱水靴套加工设备.pdf VIP
- 【腾讯广告营销洞察】Z世代消费力白皮书.pdf VIP
- 统编版(2024)新教材小学三年级道德与法治上册第二单元《爱科学 学科学》(复习课件).pptx VIP
- 一例基于5A护理模式下的AECOPD患者肺康复改善护理个案(1) PPT课件.pptx VIP
- 湘美版小学六年级美术上册-《田间的精灵》同步课件.pptx VIP
- 广州市居住小区配套设施建设暂行规定.doc VIP
原创力文档


文档评论(0)