排序算法python版本
生活随笔
收集整理的這篇文章主要介紹了
排序算法python版本
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、冒泡排序
# coding:utf-8# 冒泡排序 # 1. 外層循環(huán)負(fù)責(zé)幫忙遞減內(nèi)存循環(huán)的次數(shù)【len-1, 1】 # 2. 內(nèi)層循環(huán)負(fù)責(zé)前后兩兩比較, 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為列表下標(biāo)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 """ 插入排序和冒泡排序的區(qū)別在于:插入排序的前提是:左邊是有序的數(shù)列 而冒泡排序:相鄰的值進(jìn)行交換,一共進(jìn)行n次交換 """ from __future__ import print_functiondef insert_sort(l):# 循環(huán) 除第一個(gè)數(shù)字組成的有序數(shù)組 以外的數(shù)字for i in range(1, len(l)):# 每一個(gè)數(shù)字,依次和有序數(shù)組進(jìn)行比較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)# 從中間,進(jìn)行數(shù)據(jù)的拆分, 遞歸的返回?cái)?shù)據(jù)進(jìn)行迭代排序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# 結(jié)束排序if i >= j:return# 保存首個(gè)數(shù)值key = nums[i]# 一次排序,i和j的值不斷的靠攏,然后最終停止,結(jié)束一次排序while i < j:# 和最右邊的比較,如果>=key,然后j-1,慢慢的和前一個(gè)值比較;如果值<key,那么就交換位置while i < j and key <= nums[j]:print(key, nums[j], '*' * 30)j -= 1nums[i] = nums[j]# 交換位置后,然后在和最左邊的值開始比較,如果<=key,然后i+1,慢慢的和后一個(gè)值比較;如果值>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、基數(shù)排序
#************************基數(shù)排序**************************** #確定排序的次數(shù) #排序的順序跟序列中最大數(shù)的位數(shù)相關(guān) def radix_sort_nums(L):maxNum = L[0] #尋找序列中的最大數(shù)for x in L:if maxNum < x:maxNum = x #確定序列中的最大元素的位數(shù)times = 0while (maxNum > 0):maxNum = int((maxNum/10))times += 1return times #找到num從低到高第pos位的數(shù)據(jù) def get_num_pos(num, pos):return (int((num/(10**(pos-1))))) % 10 #基數(shù)排序 def radix_sort(L):count = 10 * [None] #存放各個(gè)桶的數(shù)據(jù)統(tǒng)計(jì)個(gè)數(shù)bucket = len(L) * [None] #暫時(shí)存放排序結(jié)果 #從低位到高位依次執(zhí)行循環(huán)for pos in range(1, radix_sort_nums(L)+1):#置空各個(gè)桶的數(shù)據(jù)統(tǒng)計(jì)for x in range(0, 10):count[x] = 0#統(tǒng)計(jì)當(dāng)前該位(個(gè)位,十位,百位....)的元素?cái)?shù)目for x in range(0, len(L)):#統(tǒng)計(jì)各個(gè)桶將要裝進(jìn)去的元素個(gè)數(shù)j = get_num_pos(int(L[x]), pos)count[j] += 1#count[i]表示第i個(gè)桶的右邊界索引for x in range(1,10):count[x] += count[x-1]#將數(shù)據(jù)依次裝入桶中for x in range(len(L)-1, -1, -1):#求出元素第K位的數(shù)字j = get_num_pos(L[x], pos)#放入對(duì)應(yīng)的桶中,count[j]-1是第j個(gè)桶的右邊界索引bucket[count[j]-1] = L[x]#對(duì)應(yīng)桶的裝入數(shù)據(jù)索引-1count[j] -= 1# 將已分配好的桶中數(shù)據(jù)再倒出來,此時(shí)已是對(duì)應(yīng)當(dāng)前位數(shù)有序的表for x in range(0, len(L)):L[x] = bucket[x]6、選擇排序
# coding:utf8 """ 選擇排序和冒泡排序的區(qū)別在于:選擇排序的前提是:找到最大值的位置,最后才進(jìn)行1次交換 而冒泡排序:相鄰的值進(jìn)行交換,一共進(jìn)行n次交換 """ from __future__ import print_functiondef selection_sort(l):length = len(l) - 1while length:index = length# 第一個(gè)數(shù)字,和后面每一個(gè)數(shù)字進(jìn)行對(duì)比,找出最大值,放到最后!!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):# 依次進(jìn)行分層while increment:# 每一層,都進(jìn)行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("結(jié)束", l)總結(jié)
以上是生活随笔為你收集整理的排序算法python版本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全军出击模拟器无法开枪怎么回事
- 下一篇: websocket python爬虫_p