




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面試時(shí)的Java數(shù)據(jù)構(gòu)造與算法查找和排序算法是算法的入門(mén)知識(shí),其經(jīng)典思想能夠用于好多算法中間。由于其實(shí)現(xiàn)代碼較短,應(yīng)用較常有。所以在面試中常常會(huì)問(wèn)到排序算法及其有關(guān)的問(wèn)題。但萬(wàn)變不離其宗,只要熟習(xí)了思想,靈巧運(yùn)用也不是難事。一般在面試中最常考的是迅速排序和合并排序,而且常常有面試官要求現(xiàn)場(chǎng)寫(xiě)出這兩種排序的代碼。對(duì)這兩種排序的代碼必定要手到擒來(lái)才行。還有插入排序、冒泡排序、堆排序、基數(shù)排序、桶排序等。面試官關(guān)于這些排序可能會(huì)要求比較各自的好壞、各樣算法的思想及其使用處景。還有要會(huì)剖析算法的時(shí)間和空間復(fù)雜度。往常查找和排序算法的觀察是面試的開(kāi)始,假如這些問(wèn)題回答不好,預(yù)計(jì)面試官都沒(méi)有持續(xù)面試下去的興趣都沒(méi)了。所以想開(kāi)個(gè)好頭就要把常有的排序算法思想及其特色要嫻熟掌握,有必需時(shí)要嫻熟寫(xiě)出代碼。接下來(lái)我們就剖析一下常有的排序算法及其使用處景。限于篇幅,某些算法的詳盡演示和圖示請(qǐng)自行找尋詳盡的參照。冒泡排序冒泡排序是最簡(jiǎn)單的排序之一了,其大概思想就是經(jīng)過(guò)與相鄰元素的比較和互換來(lái)把小的數(shù)互換到最前面。這個(gè)過(guò)程近似于水泡向上漲同樣,所以而得名。舉個(gè)栗子,對(duì)5,3,8,6,4這個(gè)無(wú)序序列進(jìn)行冒泡排序。第一從后向前冒泡,4和6比較,把4互換到前面,序列變?yōu)?,3,8,4,6。同理4和8互換,變?yōu)?,3,4,8,6,3和4無(wú)需互換。5和3互換,變?yōu)?,5,4,8,6,3.這樣一次冒泡就完了,把最小的數(shù)3排到最前面了。對(duì)剩下的序列挨次冒泡就會(huì)獲得一個(gè)有序序列。冒泡排序的時(shí)間復(fù)雜度為O(n^2)。實(shí)現(xiàn)代碼:/***@Description:冒泡排序算法實(shí)現(xiàn)*@author王旭*/publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){if(arr==null||==0)return;for(inti=0;i){for(intj=;j>i;j--){if(arr[j]]){swap(arr,j-1,j);}}}}publicstaticvoidswap(int[]arr,inti,intj){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}選擇排序選擇排序的思想其實(shí)和冒泡排序有點(diǎn)近似,都是在一次排序后把最小的元素放到最前面。但是過(guò)程不一樣,冒泡排序是經(jīng)過(guò)相鄰的比較和互換。而選擇排序是經(jīng)過(guò)對(duì)整體的選擇。舉個(gè)栗子,對(duì)5,3,8,6,4這個(gè)無(wú)序序列進(jìn)行簡(jiǎn)單項(xiàng)選擇擇排序,第一要選擇5以外的最小數(shù)來(lái)和5互換,也就是選擇3和5互換,一次排序后就變?yōu)榱?,5,8,6,4.對(duì)剩下的序列一次進(jìn)行選擇和交換,最后就會(huì)獲得一個(gè)有序序列。其實(shí)選擇排序能夠當(dāng)作冒泡排序的優(yōu)化,由于其目的同樣,不過(guò)選擇排序只有在確立了最小數(shù)的前提下才進(jìn)行互換,大大減少了互換的次數(shù)。選擇排序的時(shí)間復(fù)雜度為O(n^2)。實(shí)現(xiàn)代碼:/***@Description:簡(jiǎn)單項(xiàng)選擇擇排序算法的實(shí)現(xiàn)*@author王旭*/publicclassSelectSort{publicstaticvoidselectSort(int[]arr){if(arr==null||==0)return;intminIndex=0;for(inti=0;i一下整理牌的時(shí)候應(yīng)當(dāng)也是這樣吧。而后8不用動(dòng),6插在8前面,8后移一位,4插在5前面,從5開(kāi)始都向后移一位。注意在插入一個(gè)數(shù)的時(shí)候要保證這個(gè)數(shù)前面的數(shù)已經(jīng)有序。簡(jiǎn)單插入排序的時(shí)間復(fù)雜度也是O(n^2)。實(shí)現(xiàn)代碼:/***@Description:
簡(jiǎn)單插入排序算法實(shí)現(xiàn)*@author*/
王旭publicclassInsertSort{publicstaticvoidinsertSort(int[]arr){if(arr==null||==0)return;for(inti=1;i]。第一將這個(gè)序列區(qū)分紅M個(gè)的子區(qū)間(桶)。而后鑒于某種映照函數(shù),將待排序列的重點(diǎn)字k映照到第i個(gè)桶中(即桶數(shù)組B的下標(biāo)i),那么該重點(diǎn)字k就作為B[i]中的元素(每個(gè)桶B[i]都是一組大小為N/M的序列)。接著對(duì)每個(gè)桶B[i]中的所有元素進(jìn)行比較排序(能夠使用快排)。而后挨次列舉輸出B[0].B[M]中的所有內(nèi)容即是一個(gè)有序序列。bindex=f(key)此中,bindex為桶數(shù)組B的下標(biāo)(即第bindex個(gè)桶),k為待排序列的重點(diǎn)字。桶排序之所以能夠高效,其重點(diǎn)在于這個(gè)映照函數(shù),它一定做到:假如關(guān)鍵字k1舉個(gè)栗子:若是待排序列K={49、38、35、97、76、73、27、49}。這些數(shù)據(jù)所有在1—100之間。所以我們定制10個(gè)桶,而后確立映照函數(shù)f(k)=k/10。則第一個(gè)重點(diǎn)字49將定位到第4個(gè)桶中(49/10=4)。挨次將所有重點(diǎn)字所有堆入桶中,并在每個(gè)非空的桶中進(jìn)行迅速排序后獲得如下圖。只需次序輸出每個(gè)B[i]中的數(shù)據(jù)就能夠獲得有序序列了。桶排序剖析:桶排序利用函數(shù)的映照關(guān)系,減少了幾乎所有的比較工作。實(shí)質(zhì)上,桶排序的f(k)值的計(jì)算,其作用就相當(dāng)于快排中區(qū)分,希爾排序中的子序列,合并排序中的子問(wèn)題,已經(jīng)把大批數(shù)據(jù)切割成了基本有序的數(shù)據(jù)塊(桶)。而后只需要對(duì)桶中的少許數(shù)據(jù)做先進(jìn)的比較排序即可。對(duì)N個(gè)重點(diǎn)字進(jìn)行桶排序的時(shí)間復(fù)雜度分為兩個(gè)部分:(1)循環(huán)計(jì)算每個(gè)重點(diǎn)字的桶映照函數(shù),這個(gè)時(shí)間復(fù)雜度是O(N)。(2)利用先進(jìn)的比較排序算法對(duì)每個(gè)桶內(nèi)的所有數(shù)據(jù)進(jìn)行排序,其時(shí)間復(fù)雜度為∑O(Ni*logNi)。此中Ni為第i個(gè)桶的數(shù)據(jù)量。很明顯,第(2)部分是桶排序性能利害的決定要素。盡量減少桶內(nèi)數(shù)據(jù)的數(shù)目是提升效率的獨(dú)一方法(由于鑒于比較排序的最好均勻時(shí)間復(fù)雜度只好達(dá)到O(N*logN)了)。所以,我們需要盡量做到下邊兩點(diǎn):映照函數(shù)f(k)能夠?qū)個(gè)數(shù)據(jù)均勻的分派到M個(gè)桶中,這樣每個(gè)桶就有[N/M]個(gè)數(shù)據(jù)量。盡量的增大桶的數(shù)目。極限狀況下每個(gè)桶只好獲得一個(gè)數(shù)據(jù),這樣就完整避開(kāi)了桶內(nèi)數(shù)據(jù)的“比較”排序操作。自然,做到這一點(diǎn)很不簡(jiǎn)單,數(shù)據(jù)量巨大的狀況下,f(k)函數(shù)會(huì)使得桶會(huì)合的數(shù)目巨大,空間浪費(fèi)嚴(yán)重。這就是一個(gè)時(shí)間代價(jià)和空間代價(jià)的衡量問(wèn)題了。關(guān)于N個(gè)待排數(shù)據(jù),M個(gè)桶,均勻每個(gè)桶[N/M]個(gè)數(shù)據(jù)的桶排序均勻時(shí)間復(fù)雜度為:O(N)+O(M(N/M)log(N/M))=O(N+N(logN-logM))=O(N+NlogN-N*logM)當(dāng)N=M時(shí),即極限狀況下每個(gè)桶只有一個(gè)數(shù)據(jù)時(shí)。桶排序的最好效率能夠達(dá)到O(N)??偨Y(jié):桶排序的均勻時(shí)間復(fù)雜度為線性的O(N+C),此中C=N*(logN-logM)。假如有關(guān)于同樣的N,桶數(shù)目M越大,其效率越高,最好的時(shí)間復(fù)雜度達(dá)到O(N)。自然桶排序的空間復(fù)雜度為O(N+M),假如輸入數(shù)據(jù)特別宏大,而桶的數(shù)目也特別多,則空間代價(jià)無(wú)疑是昂貴的。別的,桶排序是穩(wěn)固的。實(shí)現(xiàn)代碼:/***@Description:桶排序算法實(shí)現(xiàn)*@author王旭*/publicclassBucketSort{publicstaticvoidbucketSort(int[]arr){if(arr==null&==0)return;intbucketNums=10;dd(arr[i]);}sEmpty()){(i));dd(arr[i]);}returnbuf;}/**采集*@paramarr把分派的數(shù)據(jù)采集到arr中@parambuf*/publicstaticvoidcollecte(int[]arr,List>buf){intk=0;for(Listbucket:buf){for(intele:bucket){arr[k++]=ele;}}}/**獲得最大位數(shù)@paramx@return*/publicstaticintgetMaxBit(int[]arr){intmax=;for(intele:arr){intlen=(ele+"").length();if(len>max)max=len;}returnmax;}/***獲得x的第n位,假如沒(méi)有則為0.@paramx@paramn@return*/publicstaticintgetNBit(intx,intn){Stringsx=x+"";if()n)return0;elsereturn()-n)-'0';}}總結(jié)在前面的介紹和剖析中我們提到了冒泡排序、選擇排序、插入排序三種簡(jiǎn)單的排序及其變種迅速排序、堆排序、希爾排序三種比較高效的排序。后邊我們又剖析了鑒于分治遞歸思想的合并排序還有計(jì)數(shù)排序、桶排序、基數(shù)排序三種線性排序。我們能夠知道排序算法要么簡(jiǎn)單有效,要么是利用簡(jiǎn)單排序的特色加以改良,要么是以空間換取時(shí)間在特定狀況下的高效排序??墒沁@些排序方法都不是固定不變的,需要聯(lián)合詳細(xì)的需乞降場(chǎng)景來(lái)選擇甚至組合使用。才能達(dá)到高效穩(wěn)固的目的。沒(méi)有最好的排序,只有最合適的排序。下邊就總結(jié)一下排序算法的各自的使用處景和合用處合。從均勻時(shí)間來(lái)看,迅速排序是效率最高的,但迅速排序在最壞狀況下的時(shí)間性能不如堆排序和合并排序。爾后者對(duì)比較的結(jié)果是,在n較大時(shí)合并排序使用時(shí)間較少,但使用協(xié)助空間許多。上邊說(shuō)的簡(jiǎn)單排序包含除希爾排序以外的所有冒泡排序、插入排序、簡(jiǎn)單項(xiàng)選擇擇排序。此中直接插入排序最簡(jiǎn)單,但序列基本有序或許n較小時(shí),直接插入排序是好的方法,所以常將它和其余的排序方法,如迅速排序、合并排序等聯(lián)合在一同使用?;鶖?shù)排序的時(shí)間復(fù)雜度也能夠?qū)懗蒓(d*n)。所以它最使用于n值很大而重點(diǎn)字較小的的序列。若重點(diǎn)字也很大,而序列中大部分記錄的最高重點(diǎn)字均不一樣,則亦可先按最高重點(diǎn)字不同,將序列分紅若干小的子序列,爾后進(jìn)行直接插入排序。從方法的穩(wěn)固性來(lái)比較,基數(shù)排序是穩(wěn)固的內(nèi)排方法,所有時(shí)間復(fù)雜度為O(n^2)的簡(jiǎn)單排序也是穩(wěn)固的??墒茄杆倥判颉⒍雅判?、希爾排序等時(shí)間性能較好的排序方法都是不穩(wěn)固的。穩(wěn)固性需要依據(jù)詳細(xì)需求選擇。上邊的算法實(shí)現(xiàn)大部分是使用線性儲(chǔ)存構(gòu)造,像插入排序這類(lèi)算法用鏈表實(shí)現(xiàn)更好,省去了挪動(dòng)元素的時(shí)間。詳細(xì)的儲(chǔ)存構(gòu)造在詳細(xì)的實(shí)現(xiàn)版本中也是不一樣的。附:鑒于比較排序算法時(shí)間下限為O(nlogn)的證明:鑒于比較排序下限的證明是經(jīng)過(guò)決議樹(shù)證明的,決議樹(shù)的高度Ω(nlgn),這樣就得出了比較排序的下限。第一要引入決議樹(shù)。第一決議樹(shù)是一顆二叉樹(shù),每個(gè)節(jié)點(diǎn)表示元素之間一組可能的排序,它予以京進(jìn)行的比較相一致,比較的結(jié)果是樹(shù)的邊。先來(lái)說(shuō)明一些二叉樹(shù)的性質(zhì),令T是深度為d的二叉樹(shù),則T最多有2^片樹(shù)葉。擁有L片樹(shù)葉的二叉樹(shù)的深度起碼
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大竹縣竹中中考數(shù)學(xué)試卷
- 營(yíng)養(yǎng)型輸液項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 自籌經(jīng)費(fèi)措施方案
- 喀什非開(kāi)挖頂管施工方案
- 智能制造與物聯(lián)網(wǎng)(IoT)應(yīng)用的策略及實(shí)施方案
- 新型城鎮(zhèn)化中的農(nóng)村振興與現(xiàn)代農(nóng)業(yè)發(fā)展的策略
- 能源結(jié)構(gòu)優(yōu)化與清潔能源轉(zhuǎn)型的策略
- 降碳減污擴(kuò)綠增長(zhǎng)的經(jīng)濟(jì)學(xué)分析
- 文化交流與一帶一路人文合作的推動(dòng)路徑
- 更大力度穩(wěn)定和擴(kuò)大就業(yè)的策略及實(shí)施路徑
- 人工挖孔樁施工危險(xiǎn)源辨識(shí)與評(píng)價(jià)及應(yīng)對(duì)措施
- 品管圈成果匯報(bào)——提高導(dǎo)管固定正確率PPT課件
- 第2講 麥克斯韋方程組
- 讀懂教材、讀懂學(xué)生、讀懂課堂,構(gòu)建和諧有效的課堂教學(xué)
- 裝飾施工進(jìn)度計(jì)劃網(wǎng)絡(luò)圖及橫道圖
- 機(jī)械畢業(yè)實(shí)習(xí)報(bào)告
- 材料科學(xué)與工程專(zhuān)業(yè) 畢業(yè)論文
- 糖尿病視網(wǎng)膜病變PPT課件
- 古詩(shī)分類(lèi)講解五思鄉(xiāng)懷人詩(shī)
- 多極磁燃?xì)猸h(huán)保節(jié)能器-合力金科技
- 青少年心理學(xué)書(shū)籍:青少年心理學(xué)
評(píng)論
0/150
提交評(píng)論