工作不重,看下算法書:小灰的算法之旅,挺不錯的,有基礎的可以看看,小瑕疵就是代碼是用c++ 寫的,有時候看起來怪怪。
優化一、
在提前N次就排好順序後,在N+1輪排序結束後跳出大循環,結束排序
尷尬:有可能跳出循環的那一輪,與正常結束循環數一樣
1 def sort(array): 2 for i in range(len(array)-1): 3 isNotchange=True 4 for j in range(len(array)-i-1): 5 print(array[j], j) 6 if array[j] > array[j+1]: 7 array[j],array[j+1] = array[j+1],array[j] 8 isNotchange=False 9 if isNotchange==True: 10 break
優化二、
在第N次排順完成後,後半段數字已完成排序,則從N+1輪排序開始,後半段數字不用參與排序
1 def maoPao(array): 2 unorderedBorder = len(array) - 1 3 lastExchangeNumberIndex=0 4 for i in range(len(array)-1): 5 isExchangeNumber = True 6 for j in range( unorderedBorder): 7 if array[j] > array[j+1]: 8 print(array[j],j) 9 array[j],array[j+1] = array[j+1],array[j] 10 lastExchangeNuberIndex=j 11 isChangeNumber=False 12 print("第 {0} 輪輸出結果 : {1}".format(i + 1, array)) 13 unorderedBorder=lastExchangeNumberIndex 14 if isExchangeNumber==True: 15 break
優化三、
例子:b=[2,3,4,4,5,7,8,1]
1 def cocktailSort(array): 2 for i in range(int(len(array)/2)): 3 isNotchange = True 4 if i % 2 == 0 : 5 for j in range(len(array) - i - 1): 6 if array[j] > array[j + 1]: 7 array[j], array[j + 1] = array[j + 1], array[j] 8 isNotchange = False 9 print("左到右,第 {0} 輪輸出結果 : {1}".format(i + 1, array)) 10 print(" ") 11 if isNotchange == True: 12 break 13 else: 14 print("右到左,第 i 輪循環: ", i) 15 for j in range(len(array)-1,-1+i,-1): 16 if array[j] < array[j-1]: 17 print("j de zhi", j) 18 array[j], array[j - 1] = array[j - 1], array[j] 19 isNotchange = False 20 print("右到左,第 {0} 輪輸出結果 : {1}".format(i + 1, array)) 21 print(" ") 22 if isNotchange == True: 23 break