排序算法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 nums if __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_function def 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-8 def MergeSort(nums): if len(nums) <= 1: return nums num = 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, 0 result = [] while l < len(left) and r < len(right): if left[l] < right[r]: result.append(left[l]) l += 1 else: result.append(right[r]) r += 1 result += left[l:] result += right[r:] return result if __name__ == "__main__": nums = [2, 6, 8, 5, 1, 4, 9, 3, 7] nums = MergeSort(nums) print('result:', nums) 

4、快速排序

#!/usr/bin/python # coding:utf8 def quick_sort(nums, start, end): i = start j = 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 -= 1 nums[i] = nums[j] # 交换位置后,然后在和最左边的值开始比较,如果<=key,然后i+1,慢慢的和后一个值比较;如果值>key,那么就交换位置 while i < j and key >= nums[i]: print(key, nums[i], '*' * 30) i += 1 nums[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 = 0 while (maxNum > 0): maxNum = int((maxNum/10)) times += 1 return 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] #对应桶的装入数据索引-1 count[j] -= 1 # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 for x in range(0, len(L)): L[x] = bucket[x] 

6、选择排序

# coding:utf8 """ 选择排序和冒泡排序的区别在于: 选择排序的前提是:找到最大值的位置,最后才进行1次交换 而冒泡排序:相邻的值进行交换,一共进行n次交换 """ from __future__ import print_function def selection_sort(l): length = len(l) - 1 while length: index = length # 第一个数字,和后面每一个数字进行对比,找出最大值,放到最后!! for j in range(length): if l[j] > l[index]: index = j l[length], l[index] = l[index], l[length] print(len(l) - length, l) length -= 1 if __name__ == "__main__": l = [5, 1, 9, 3, 2, 7] print(l) selection_sort(l) print("result: " + str(l)) 

7、希尔排序

# coding: utf8 from __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 l def shell_sort(l, increment): # 依次进行分层 while increment: # 每一层,都进行n次插入排序 for i in range(0, increment): insert_sort(l, i, increment) increment -= 1 return l if __name__ == "__main__": l = [5, 2, 9, 8, 1, 10, 3, 4, 7] increment = len(l)/3+1 if len(l)%3 else len(l)/3 print("开始", l) l = shell_sort(l, increment) print("结束", l) 
    原文作者:排序算法
    原文地址: https://blog.csdn.net/jiaoyangwm/article/details/81807774
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞