python算法 之 排序
注:
算法演示工具: https://algorithm-visualizer.org/
参考:https://www.runoob.com/python3/python3-examples.html
参考:《算法图解》
环境: Visual Code Python2.7
冒泡排序
简介:对n个数据操作n-1轮,每轮中对元素进行比对,找出最大(最小)的值。
时间:O(n^2)
图示:

示例:
import sys def bubbleSort(arr): n = len(arr) for i in range(0,n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] if __name__ == '__main__': arr = [-5,10,8,6,0,5] print(u'排序前的数组:{}'.format(arr)) bubbleSort(arr) print(u'排序后的数组:{}'.format(arr))
选择排序
简介:从未排序的序列中找到最小(最大)元素,存放到新序列中。然后再从剩下未排序的序列中继续查找,直到末尾。
时间: O(n^2)
图示:

示例:
# -*- coding:UTF-8 -*- #!/usr/bin/env python import sys # 查找最小原色 def FindSmallest(arr): smallest = arr[0] # 默认最小值 smallIndex = 0 # 默认最小值索引 for i in range(1,len(arr)): if arr[i] < smallest: smallest = arr[i] smallIndex = i return smallIndex # 选择排序 def SelectSort(arr): newArr = [] for i in range(len(arr)): print(u'--> 查找序列:{0}'.format(arr)) # 查找数组中最小元素索引 smallIndex = FindSmallest(arr) # 原有数组移除指定值 smallValue = arr.pop(smallIndex) # 将值放置到新列表中 newArr.append(smallValue) return newArr if __name__ == '__main__': arr = [-5,10,8,6,0,5] print(u'未排序序列:{0}'.format(arr)) newArr = SelectSort(arr) print(u'已排序序列:{0}'.format(newArr)) ''' 未排序序列:[-5, 10, 8, 6, 0, 5] --> 查找序列:[-5, 10, 8, 6, 0, 5] --> 查找序列:[10, 8, 6, 0, 5] --> 查找序列:[10, 8, 6, 5] --> 查找序列:[10, 8, 6] --> 查找序列:[10, 8] --> 查找序列:[10] 已排序序列:[-5, 0, 5, 6, 8, 10] '''
快速排序
简介:采用D&C(divide and conquer)分而治之方法,一种著名的递归式问题解决方法。
思想:
1. 从数列中取出一个数作为基准值
2. 分区,将数列中比基准值大的数放置在右边区间,比基准值小的数放在左边区间
3. 重复执行1,2步,直到左右区间各剩下一个数。
时间: O(N*logN)
def quickSort(arr): # 数组为空或者仅有一个元素,无需排序 if len(arr) < 2: return arr # 基准值 pivot = arr[0] # 小于基准值元素组成的数列 lessArr = [i for i in arr[1:] if i <= pivot] # 大于基准值元素组成的数列 greatArr = [i for i in arr[1:] if i > pivot] print(pivot, lessArr, greatArr) return quickSort(lessArr) + [pivot] + quickSort(greatArr) if __name__ == '__main__': arr = [-5,10,8,16,0,20,1,4,-10,-7,-8] print(u'排序前的数组:{}'.format(arr)) newArr = quickSort(arr) print(u'排序后的数组:{}'.format(newArr)) ''' 排序前的数组:[-5, 10, 8, 16, 0, 20, 1, 4, -10, -7, -8] (-5, [-10, -7, -8], [10, 8, 16, 0, 20, 1, 4]) (-10, [], [-7, -8]) (-7, [-8], []) (10, [8, 0, 1, 4], [16, 20]) (8, [0, 1, 4], []) (0, [], [1, 4]) (1, [], [4]) (16, [], [20]) 排序后的数组:[-10, -8, -7, -5, 0, 1, 4, 8, 10, 16, 20] '''

浙公网安备 33010602011771号