写在前面
干货儿
平方级排序
冒泡排序
def bubble_sort(arr): length = len(arr) for i in range(length): for j in range(length-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr
选择排序
def select_sort(arr): length = len(arr) for i in range(length): min_ix = i for j in range(i, length): if arr[j] < arr[min_ix]: min_ix = j arr[min_ix], arr[i] = arr[i], arr[min_ix] return arr
插入排序
def insert_sort(arr): length = len(arr) for i in range(length): for j in range(i, 0, -1): if arr[j] < arr[j-1]: arr[j], arr[j-1] = arr[j-1], arr[j] return arr
对数级排序
希尔排序
def shell_sort(arr): n = len(arr) gap = int(n/2) while gap > 0: for i in range(gap,n): temp = arr[i] j = i while j >= gap and arr[j-gap] >temp: arr[j] = arr[j-gap] j -= gap arr[j] = temp gap = int(gap/2) return arr
归并排序
def merge(left, right): i = j = 0 res = [] while i < len(left) and j < len(right): if left[i] < right[j]: res.append(left[i]) i += 1 else: res.append(right[j]) j += 1 if i == len(left): res.extend(right[j:]) else: res.extend(left[i:]) return res def merge_sort(arr): if len(arr) <= 1: return arr length = len(arr) i = int(length / 2) left = merge_sort(arr[:i]) right = merge_sort(arr[i:]) return merge(left, right)
快速排序
def fast_sort(arr): if len(arr) <= 1: return arr pivot = arr.pop() left = [i for i in arr if i <= pivot] right = [i for i in arr if i > pivot] return fast_sort(left) + [pivot] + fast_sort(right)
以上算法需要额外的空间,如果我们将小于等于基准的元素不断置于基准元素之前,大于基准的元素置于基准元素之后,那么就可以实现不需要额外空间的就地排序。
def fast_sort_on_extra_spacing(arr): l = 0 h = len(arr)-1 def partition(arr, l, h): pivot = arr[h] for i in range(l, h): if arr[i] <= pivot: arr[l], arr[i] = arr[i], arr[l] l += 1 arr[h], arr[l] = arr[l], arr[h] return l def fast_sort(arr, l, h): if l < h: pivot = partition(arr, l, h) fast_sort(arr, l, pivot-1) fast_sort(arr, pivot+1, h) return arr return fast_sort(arr, l, h)
堆排序
def heapify(arr, n, i): # build a max root heap max_ix = i left_i = 2 * i + 1 right_i = 2 * i + 2 if left_i < n and arr[max_ix] < arr[left_i]: max_ix = left_i if right_i < n and arr[max_ix] < arr[right_i]: max_ix = right_i if max_ix != i: arr[max_ix], arr[i] = arr[i], arr[max_ix] heapify(arr, n, max_ix) def heap_sort(arr): for i in range(n-1, -1, -1): heapify(arr, n, i) for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) return arr
线性级排序
计数排序
def count_sort(arr): min_ix, max_ix = min(arr), max(arr) bucket = [0 for _ in range(max_ix+1)] for i in arr: bucket[i] += 1 return sum([[i] * bucket[i] for i in range(len(bucket)) if bucket[i] != 0], [])
桶排序
def bucket_sort(arr): min_ix, max_ix = min(arr), max(arr) bucket_range = (max_ix - min_ix) / len(arr) # +1 avoid for that max_ix - min_ix will raise a IndexError temp_bucket = [[] for i in range(len(arr) + 1)] for i in arr: temp_bucket[int((i-min_ix)//bucket_range)].append(i) return sum(temp_bucket, [])
基数排序
def radix_sort(arr): max_value = max(arr) num_digits = len(str(max_value)) for i in range(num_digits): bucket = [[] for _ in range(10)] for j in arr: bucket[j//(10**i)%10].append(j) arr = [j for i in bucket for j in i] return arr
笑死人不偿命排序
睡排序
猴子排序
排序算法复杂度、稳定性及通用性总结
写在最后
排序算法是算法学习中的核心。掌握排序算法及其思想是学习其它算法的基础。希望大家可以熟练掌握。欢迎关注个人博客:药少敏的博客。