前
每逢周末就遇雨期,閑暇之余,搗鼓了下python,心心念想學習,今天就在電腦上裝了個2.7,學習了下經典算法,冒泡與選擇排序法
第一次寫關於python的文章,說的不當之處,多多指正,我積極改正
在之前,曾寫過使用java和C語言實現該兩種排序法,詳情見https://www.cnblogs.com/hong-fithing/p/7615907.html
搭建環境,准備工作就不冗余介紹了,網上搜羅一大堆
目錄
冒泡排序法
選擇排序法
冒泡排序法
冒泡類似於汽水現象,搖動一下,就有很多泡往上冒,概念不多說,直接看一張執行的結果圖,看圖分析,如下

圖片中將每次的排序過程都打印出來,這樣一看,就很簡潔明了,比如第一次排序,相鄰兩個數進行比較,直到100大於2時,做了交換,然后沒有數比100再大,所以100排在了最后,類似於找到了最大的值,第二次排序,就是找到第二大的值,並排在倒數第二個,依次類推
代碼實現比java簡單,大眾之言果然不假,沒有java一些條件的限制,比如聲明變量這些,python中是直接使用,見代碼如下:
1 #coding=utf-8 2 lis = raw_input('請輸入十個正整數:') 3 arrays=[int(a) for a in lis.split()] 4 print(arrays) 5 for a in range(len(arrays)): 6 for b in range(len(arrays)-1): 7 if arrays[b] > arrays[b+1]: 8 temp = arrays[b] 9 arrays[b] = arrays[b+1] 10 arrays[b+1] = temp 11 for c in arrays: 12 print(str(c)),
這是很簡單的排序,輸入數據,通過for循環排序,輸出結果,文前所貼圖片,就是在該基礎上加了幾句代碼,目的只是讓排序過程更直觀,代碼如下:
#coding=utf-8 lis = raw_input('\n請輸入十個正整數:')#2版本的需要使用raw_input輸入 arrays=[int(a) for a in lis.split()] #將輸入每個數以空格鍵隔開做成數組 print("輸入的十個整數為:") print(arrays) for a in range(len(arrays)): #取arrays的長度做為循環條件 for b in range(len(arrays)-1): #取arrays-1的長度做為循環條件 if arrays[b] > arrays[b+1]: #如果數組中的第一個值大於第二個值 temp = arrays[b] #則將大的值arrays[b]賦值在temp中 arrays[b] = arrays[b+1] #將小的值arrays[b+1]賦值在第一個值中 arrays[b+1] = temp #將temp中的值賦值在第二個值中,實現更換位置 print("\n第%d" % (a + 1) + "次排序為:") for c in range(len(arrays)): #循環獲取數組的長度 print arrays[c], #打印排序的過程 print("\n最終的排序為:") for c in arrays: #循環獲取數組長度 print str(c), #打印最終的排序結果,輸入逗號是為了不換行顯示
在琢磨python的時候,遇到兩個小問題,也是自己對python語言的不熟悉導致
問題一:
由於裝的是2.7版本的python,input是需要使用raw_input來實現,在使用input函數的時候,運行程序就報File "<string>", line 1, in <module>錯誤
問題二:
使用print arrays[c]輸出數組排序時,沒有按一行輸出,查看結果不直觀,通過度娘查詢,更多的是使用end來結束,發現該語言只支持3,然后查詢到在輸出語句后面加,逗號即可
兩個很小很小的問題,但對於我剛學習python還是琢磨了一番,所以在此記錄下
選擇排序法
冒泡排序磕磕絆絆成功后,選擇排序法就相對簡單一些了,排序邏輯上稍有些不同而已
選擇排序是將,最大或者最小值(依條件而定)與第一個值交換順序,與冒泡不同,看如圖所示:

從圖中可知,第一次排序中,是找到了最大的值100與第一位值交換了順序,第二次排序,則是找到第二大的值與第二位交換順序,以此類推
直接看代碼,如下:
1 #coding=utf-8 2 lis = raw_input('\n請輸入十個正整數:') 3 arrays=[int(a) for a in lis.split()] 4 print("輸入的十個整數為:") 5 print(arrays) 6 for a in range(0,len(arrays)-1): 7 max = arrays[a] #設定一個最大值max 8 count = a #count是記住角標 9 for b in range(a+1,len(arrays)): 10 if max < arrays[b]: #如果默認的最大值小於數組值arrays[b] 11 max = arrays[b] #則將arrays[b]中的值賦值給max 12 count = b #角標賦給count 13 temp = arrays[a] #則將大的值arrays[a]賦值在temp中 14 arrays[a] = arrays[count] #將小的值arrays[count]賦值在第一個值中 15 arrays[count] = temp #將temp中的值賦值在第二個值中,實現更換位置 16 print("\n最終的排序為:") 17 for c in arrays: #循環獲取數組長度 18 print str(c), #打印最終的排序結果,輸入逗號是為了不換行顯示
這是實現選擇排序的基本語法,再看如圖所示的代碼,如下:
1 #coding=utf-8 2 lis = raw_input('\n請輸入十個正整數:')#2版本的需要使用raw_input輸入,每個數之間用空格隔開 3 arrays=[int(a) for a in lis.split()] 4 print("輸入的十個整數為:") 5 print(arrays) 6 for a in range(0,len(arrays)-1): #取arrays-1的長度做為循環條件 7 max = arrays[a] #設定一個最大值max 8 count = a #count是記住角標 9 for b in range(a+1,len(arrays)): #取a+1,arrays的長度做為循環條件 10 if max < arrays[b]: #如果默認的最大值小於數組值arrays[b] 11 max = arrays[b] #則將arrays[b]中的值賦值給max 12 count = b #角標賦給count 13 temp = arrays[a] #則將大的值arrays[a]賦值在temp中 14 arrays[a] = arrays[count] #將小的值arrays[count]賦值在第一個值中 15 arrays[count] = temp #將temp中的值賦值在第二個值中,實現更換位置 16 for c in arrays: #循環獲取數組長度 17 print str(c), #打印最終的排序結果,輸入逗號是為了不換行顯示
結
第一次使用python,看到了便捷之處,也看到了自身的短缺,需要更好的學習之。上述就是今天搗鼓的內容,內容不是很新奇,但很經典,面試過程大多都會問到。自然,這兩個代碼還有可優化之處,可增加中斷循環,當已是有序的情況下,就跳出循環,節省排序時間,學習是個很有趣的過程,加油!
