我理解的演算法 排序

2021-06-03 22:51:04 字數 1748 閱讀 6839

萬事開頭難。重新開頭更難。本來現在的水平寫不出來個啥,可是不開始永遠也無法開始。

重回這條不歸路,視野啊、遠見啊未必比那些純新人好,只能更努力一點了。在現有見識的邊界內,我對演算法、資料結構、設計模式等異常重視,基礎比想象的重要。即使有人編碼幾年了,這些基礎依然很爛但卻沒影響拿工資,我也依舊重視。這些基礎才是程式設計師的生命,它比想象的重要。

這些天開始看資料結構,任何資料結構的書開頭部分(第1、2章或者導論)都會寫一些概念性的東西。看的頭疼,不過我還是很喜歡的,定義都是嚴謹的。雖然沒有那麼聰明的頭腦,但是不影響我欣賞數學的嚴謹,最起碼觀賞總還是做得到的。蠅營狗苟的蹣跚於每行**、實現細節、客戶要求等的時候,我想還是要有乙個心思去體會些純的it界的東西,然後聯通所謂美學、哲學、方**。

先從排序演算法開始吧,我是現學現思考現記錄,希望寫下的東西值得保留,估計這東西要寫一段時間了,一點點新增吧。

氣泡排序

全是自己表述的,黃底部分是我的想法,其他的沒啥看頭了。

冒泡是比較生動形象的表述這種排序演算法的特點,石塊沉入水中,冒出個泡來。大的往下沉、小的往上浮。第一次,找出最大的沉到最下面,第二次,在剩餘的裡面找出最大的,沉到下面……最後剩乙個了,就是最輕的不用動了。所以如果n個數字排序,需要進行n-1趟:第1趟在n個數字裡找出最大的;第2趟在n-1個數字裡找出最大的;……第n-1趟在2個數字裡找出最大的。

假設乙個班級有n名學生,都參加了資料結構的考試,那麼就有了n個成績,即成績陣列arrscores[n]。用冒泡演算法從小到大排下序吧。

按照演算法思路:

(1)需要進行n-1趟挑選、調換。那麼就是

for(int i = 1 ; i < n ; ++i)

這裡有人喜歡i = n然後--i,或者喜歡i = 0,我認為都是不好的。程式是給人看的,既然外圍的迴圈思路是進行n-1趟,那麼自然應該是從1加到n-1,對應第1趟、第2趟……

(2)在第i趟裡,挑選出剩餘數目中的最大者。

for(int j = 1 ; j < n - i + 1 ; ++j )

if(第 j 個資料大於第 j+1 個資料) //交換

第i趟時,已經進行了i - 1趟,挑選出了i - 1個數字,所以剩餘數目是n - (i - 1) = n- i + 1個,需要n-i次比較找出最大的,但在編寫成績時,我們需要對陣列進行操作,而陣列下標從0開始,因此內迴圈中j記錄下標較合適,即

for(int j = 0 ; j < n - i ; ++j )

if(arrscores[ j ] >arrscores[ j+1]) ) //交換

這裡有個問題,就是內迴圈中j必須取定值,即 0或者n-1,不可能是關於i的表示式,每次挑選都是從陣列的乙個方向開始,把最小的或者最大的數字放置到另乙個方向,然後邊界向開始的方向移動(即將排好的數字排除下次排序)。

完整的語句是

for(int i = 1;i < n;++i)

for(int j = 0;jarrscores[j+1])

當然,如果稍微優化一下,就是加乙個標籤,假設第i趟發現沒有移動,即陣列已經順序排列,那麼就不用繼續了。

優化後的完整**為: 

int temp = 0;

bool change = true;

for(int i = 1;(i < n) && change;++i)

}

我的排序演算法

複雜度為n2的演算法 氣泡排序 input int陣列 length of 陣列 輸出 在int陣列上原地排序 void bubble int a,int n int i,j,temp for i 0 i n 1 i for j n 1 j i j end of for 2 a j 1 key pr...

我所理解的Reed solomon 演算法

在資料傳輸過程中難免會遇到部分資料丟失或者受到干擾而出錯,因此利用演算法來恢復錯誤的資料,reed solomon 簡稱rs 便是其中的一種常用的演算法。rs演算法是以犧牲頻寬為代價的,編碼過程中會產生一定量的冗餘資料。這種增加冗餘資料來獲得有效資料的方法在我們日常生活中其實經常會使用。舉個很簡單的...

我對KMP演算法的理解

我對kmp演算法的理解 在過去的幾天,我讀了好幾篇關於 利用kmp演算法查詢字串的解釋 的文章。出於某些原因,沒有一篇是能令我接受和理解的。每當讀到 字首的字尾的字首.這些字眼時,我都有種拿頭撞牆的衝動。最後,經過30分鐘反覆閱讀clrs的幾段文章,我決定坐下來找一些關於文字串匹配的例子,並把過程寫...