基於python語言的經典排序法(冒泡法和選擇排序法)


每逢周末就遇雨期,閑暇之余,搗鼓了下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,看到了便捷之處,也看到了自身的短缺,需要更好的學習之。上述就是今天搗鼓的內容,內容不是很新奇,但很經典,面試過程大多都會問到。自然,這兩個代碼還有可優化之處,可增加中斷循環,當已是有序的情況下,就跳出循環,節省排序時間,學習是個很有趣的過程,加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM