標籤:整數 基於 詳情 支援 ble count code 中斷 array
前
每逢周末就遇雨期,閑暇之餘,搗鼓了下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] = temp11 for c in arrays:12 print(str(c)),
這是很簡單的排序,輸入資料,通過for迴圈排序,輸出結果,文前所貼圖片,就是在該基礎上加了幾句代碼,目的只是讓排序過程更直觀,代碼如下:
#coding=utf-8lis = 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]中的值賦值給max12 count = b #角標賦給count13 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]中的值賦值給max12 count = b #角標賦給count13 temp = arrays[a] #則將大的值arrays[a]賦值在temp中14 arrays[a] = arrays[count] #將小的值arrays[count]賦值在第一個值中15 arrays[count] = temp #將temp中的值賦值在第二個值中,實現更換位置16 print("\n第%d" % (a + 1) + "次排序為:")17 for c in range(len(arrays)): #迴圈擷取數組的長度18 print arrays[c], #列印排序的過程19 print("\n最終的排序為:")20 for c in arrays: #迴圈擷取數組長度21 print str(c), #列印最終的排序結果,輸入逗號是為了不換行顯示結
第一次使用python,看到了便捷之處,也看到了自身的短缺,需要更好的學習之。上述就是今天搗鼓的內容,內容不是很新奇,但很經典,面試過程大多都會問到。自然,這兩個代碼還有可最佳化之處,可增加中斷迴圈,當已是有序的情況下,就跳出迴圈,節省排序時間,學習是個很有趣的過程,加油!
本文僅代表作者觀點,系作者@溫一壺清酒發表。轉載請註明出處:http://www.cnblogs.com/hong-fithing/
基於python語言的經典排序法(冒泡法和選擇排序法)