排序算法python版本
生活随笔
收集整理的這篇文章主要介紹了
排序算法python版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、冒泡排序
# coding:utf-8# 冒泡排序 # 1. 外層循環負責幫忙遞減內存循環的次數【len-1, 1】 # 2. 內層循環負責前后兩兩比較, index 的取值范圍【0, len-2】 len-1-i 次,求最大值放到最后 def bubble_sort(nums):# [1, len-1]for i in range(1, len(nums)-1):# [0, len-1-i]for j in range(len(nums)-i): # j為列表下標if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]return numsif __name__ == "__main__":nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]bubble_sort(nums)print('result:', nums)2、插入排序
# coding:utf8 """ 插入排序和冒泡排序的區別在于:插入排序的前提是:左邊是有序的數列 而冒泡排序:相鄰的值進行交換,一共進行n次交換 """ from __future__ import print_functiondef insert_sort(l):# 循環 除第一個數字組成的有序數組 以外的數字for i in range(1, len(l)):# 每一個數字,依次和有序數組進行比較print(l[:i])for j in range(len(l[:i])):if l[i] < l[j]:l[i], l[j] = l[j], l[i]if __name__ == "__main__":l = [5, 1, 9, 3, 2, 7]print(l)insert_sort(l)print("result: " + str(l))3、歸并排序
# coding: utf-8def MergeSort(nums):if len(nums) <= 1:return numsnum = int(len(nums)/2)# 從中間,進行數據的拆分, 遞歸的返回數據進行迭代排序left = MergeSort(nums[:num])right = MergeSort(nums[num:])print("left: ", left)print("right: ", right)print("-" * 20)return Merge(left, right)def Merge(left, right):l, r = 0, 0result = []while l < len(left) and r < len(right):if left[l] < right[r]:result.append(left[l])l += 1else:result.append(right[r])r += 1result += left[l:]result += right[r:]return resultif __name__ == "__main__":nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]nums = MergeSort(nums)print('result:', nums)4、快速排序
#!/usr/bin/python # coding:utf8def quick_sort(nums, start, end):i = startj = end# 結束排序if i >= j:return# 保存首個數值key = nums[i]# 一次排序,i和j的值不斷的靠攏,然后最終停止,結束一次排序while i < j:# 和最右邊的比較,如果>=key,然后j-1,慢慢的和前一個值比較;如果值<key,那么就交換位置while i < j and key <= nums[j]:print(key, nums[j], '*' * 30)j -= 1nums[i] = nums[j]# 交換位置后,然后在和最左邊的值開始比較,如果<=key,然后i+1,慢慢的和后一個值比較;如果值>key,那么就交換位置while i < j and key >= nums[i]:print(key, nums[i], '*' * 30)i += 1nums[j] = nums[i]nums[i] = key# 左邊排序quick_sort(nums, start, i-1)# 右邊排序quick_sort(nums, i+1, end)if __name__ == "__main__":nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]quick_sort(nums, 0, len(nums) - 1)print('result:', nums)5、基數排序
#************************基數排序**************************** #確定排序的次數 #排序的順序跟序列中最大數的位數相關 def radix_sort_nums(L):maxNum = L[0] #尋找序列中的最大數for x in L:if maxNum < x:maxNum = x #確定序列中的最大元素的位數times = 0while (maxNum > 0):maxNum = int((maxNum/10))times += 1return times #找到num從低到高第pos位的數據 def get_num_pos(num, pos):return (int((num/(10**(pos-1))))) % 10 #基數排序 def radix_sort(L):count = 10 * [None] #存放各個桶的數據統計個數bucket = len(L) * [None] #暫時存放排序結果 #從低位到高位依次執行循環for pos in range(1, radix_sort_nums(L)+1):#置空各個桶的數據統計for x in range(0, 10):count[x] = 0#統計當前該位(個位,十位,百位....)的元素數目for x in range(0, len(L)):#統計各個桶將要裝進去的元素個數j = get_num_pos(int(L[x]), pos)count[j] += 1#count[i]表示第i個桶的右邊界索引for x in range(1,10):count[x] += count[x-1]#將數據依次裝入桶中for x in range(len(L)-1, -1, -1):#求出元素第K位的數字j = get_num_pos(L[x], pos)#放入對應的桶中,count[j]-1是第j個桶的右邊界索引bucket[count[j]-1] = L[x]#對應桶的裝入數據索引-1count[j] -= 1# 將已分配好的桶中數據再倒出來,此時已是對應當前位數有序的表for x in range(0, len(L)):L[x] = bucket[x]6、選擇排序
# coding:utf8 """ 選擇排序和冒泡排序的區別在于:選擇排序的前提是:找到最大值的位置,最后才進行1次交換 而冒泡排序:相鄰的值進行交換,一共進行n次交換 """ from __future__ import print_functiondef selection_sort(l):length = len(l) - 1while length:index = length# 第一個數字,和后面每一個數字進行對比,找出最大值,放到最后!!for j in range(length):if l[j] > l[index]:index = jl[length], l[index] = l[index], l[length]print(len(l) - length, l)length -= 1if __name__ == "__main__":l = [5, 1, 9, 3, 2, 7]print(l)selection_sort(l)print("result: " + str(l))7、希爾排序
# coding: utf8from __future__ import print_function def insert_sort(l, start, increment):for i in range(start+increment, len(l), increment):for j in range(start, len(l[:i]), increment):if l[i] < l[j]:l[i], l[j] = l[j], l[i]print(increment, '--',l)return ldef shell_sort(l, increment):# 依次進行分層while increment:# 每一層,都進行n次插入排序for i in range(0, increment):insert_sort(l, i, increment)increment -= 1return lif __name__ == "__main__":l = [5, 2, 9, 8, 1, 10, 3, 4, 7]increment = len(l)/3+1 if len(l)%3 else len(l)/3print("開始", l)l = shell_sort(l, increment)print("結束", l)總結
以上是生活随笔為你收集整理的排序算法python版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全军出击模拟器无法开枪怎么回事
- 下一篇: python如何读取文件夹下的子文件夹