冒泡排序算法及Ruby版的簡(jiǎn)單實(shí)現(xiàn)
算法原理:
比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
實(shí)現(xiàn)
假設(shè)有這樣一個(gè)數(shù)組: [4, 1, 3, 2]
冒泡排序?yàn)閺牡谝粋€(gè)數(shù)開始,吧這個(gè)數(shù)與后面的數(shù)比較,如果這個(gè)數(shù)比后面的大,就交換他們的位置。
比如,第一次比較4和1,發(fā)現(xiàn)4比1大,交換 -> [1, 4, 3, 2]
第二次比較4和3,發(fā)現(xiàn)還是4大,交換 -> [1, 3, 4, 2]
第三次比較4和2,仍然4比2大,交換 -> [1, 3, 2, 4]
這樣在進(jìn)行了第一輪循環(huán)之后,最大的數(shù)4就被頂?shù)綌?shù)組的最后去了,就像泡泡一樣從水底冒起來一樣。那么,要完成整個(gè)數(shù)組的排序,只需要把最大的數(shù)頂?shù)阶詈?,然后第二輪再把第二大的?shù)頂?shù)降箶?shù)第二的位置,再來第三輪。。。。一直循環(huán)下去。
回到剛才的數(shù)組,第二輪比較開始,現(xiàn)在的狀態(tài)是[1, 3, 2, 4]
比較1和3,1小于3,跳過 -> [1, 3, 2, 4]
比較3和2,3大于2,交換 -> [1, 2, 3, 4]
這一輪到這里就可以停止了,因?yàn)榈谝惠喴呀?jīng)把最大的4頂?shù)搅俗詈?,所以第二輪只要確保第二大的數(shù)頂?shù)降箶?shù)第二就行。
然后繼續(xù)第三輪(雖然目前看起來已經(jīng)排序完成了)
比較1和2,不用交換[1, 2, 3, 4]
這里比較就全部完成。原理非常簡(jiǎn)單。
def bubble_sort(list)
list.each_index do |index|
(list.length - index - 1).times do |e|
if list[e] > list[e + 1]
list[e], list[e + 1] = list[e + 1], list[e]
end
end
end
end
相關(guān)文章
簡(jiǎn)單談?wù)凴uby的private和protected
Ruby類下對(duì)訪問控制的限制也是用public,protected和private來做的。雖然用的是和C++和Java相同的名字,但是Ruby下的protected和private定義還是有所不同的。2016-02-02
使用ruby部署工具mina快速部署nodejs應(yīng)用教程
這篇文章主要介紹了使用ruby部署工具mina快速部署nodejs應(yīng)用教程,包含mina的配置、運(yùn)行以及發(fā)布示例,需要的朋友可以參考下2014-09-09
Ruby對(duì)比Python的優(yōu)勢(shì)和劣勢(shì)
這篇文章主要介紹了Ruby對(duì)比Python的優(yōu)勢(shì)和劣勢(shì),本文分別介紹了Ruby 比 Python 的優(yōu)勢(shì)和劣勢(shì),幫助你選擇哪種語言來學(xué)習(xí),需要的朋友可以參考下2015-05-05
Ruby實(shí)現(xiàn)郵件主動(dòng)推送觸發(fā)程序
這篇文章主要介紹了Ruby實(shí)現(xiàn)郵件主動(dòng)推送觸發(fā)程序,本文給出了客戶端輪詢和服務(wù)器主動(dòng)推送的代碼實(shí)例,需要的朋友可以參考下2015-01-01
Ruby使用C++擴(kuò)展實(shí)例(含C++擴(kuò)展代碼示例)
這篇文章主要介紹了Ruby使用C++擴(kuò)展實(shí)例,含C++擴(kuò)展實(shí)現(xiàn)代碼,本文可作為Ruby中使用C++擴(kuò)展的入門教程,需要的朋友可以參考下2014-09-09
Rails中遇到錯(cuò)誤跳轉(zhuǎn)到統(tǒng)一提示錯(cuò)誤頁的方法
這篇文章主要介紹了Rails中遇到錯(cuò)誤跳轉(zhuǎn)到統(tǒng)一提示錯(cuò)誤頁的方法,本文在ApplicationController中添加捕捉錯(cuò)誤并跳轉(zhuǎn)到統(tǒng)一提示頁面,需要的朋友可以參考下2015-01-01
實(shí)例講解Ruby中的鉤子方法及對(duì)方法調(diào)用添加鉤子
鉤子方法即是在普通的方法上添加"鉤子",使特定事件發(fā)生時(shí)可以被調(diào)用,下面就來以實(shí)例講解Ruby中的鉤子方法及對(duì)方法調(diào)用添加鉤子2016-06-06

