#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/1/31 5:06 下午 # @Author : zhangronghui # @File : 1.bubblesort.py # @Software: PyCharm import pretty_errors from common import swap, sortAndAssert ''' 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 ''' def bubbleSort(a): pass if __name__ == '__main__': sortAndAssert(bubbleSort)
#!/usr/bin/env python # -*- coding: utf-8 -*- import pretty_errors from common import swap, sortAndAssert def partition(a, left, right) -> int: # 3 2 5 6 pass def quickSort(a, left=None, right=None): pass if __name__ == '__main__': sortAndAssert(quickSort)
# 低效、错误的代码 n = len(a) if n < 2: return a for i in range(1, n): for j in reversed(range(i)): if a[j] <= a[i]: break swap(a, i, j) i = j # 记得更新 i,为的是把 i 插入正确的位置 def insertionSort2(a): n = len(a) if n < 2: return a for i in range(1, n): t = a[i] # 暂存需要插入的值 # 可能插在首位, 所以加上 -1 for j in reversed(range(-1, i)): if j == -1 or a[j] <= t: a[j + 1] = t break a[j + 1] = a[j] if __name__ == '__main__': sortAndAssert(insertionSort) sortAndAssert(insertionSort1) sortAndAssert(insertionSort2)
#!/usr/bin/env python # -*- coding: utf-8 -*- import pretty_errors from common import swap, sortAndAssert ''' 1. 首先在未排序序列中找到最小元素,存放到排序序列的起始位置 2. 再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。 3. 重复第二步,直到所有元素均排序完毕。 ''' # range(10, 0, -1) 10, 9, ..., 0 def selectionSort(a): n = len(a) if n < 2: return a for i in range(n - 1): mi = i for j in range(i + 1, n): if a[j] < a[mi]: mi = j swap(a, i, mi) if __name__ == '__main__': sortAndAssert(selectionSort)
#!/usr/bin/env python # -*- coding: utf-8 -*- import pretty_errors from common import swap, sortAndAssert def mergeSort(a): pass if __name__ == '__main__': sortAndAssert(mergeSort)
#!/usr/bin/env python # -*- coding: utf-8 -*- import pretty_errors from common import swap, sortAndAssert ''' 1. 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; 2. 按增量序列个数 k,对序列进行 k 趟排序; 3. 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。 仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 一个更好理解的希尔排序实现: 将数组列在一个表中并对列排序(用插入排序)。 重复这过程,不过每次用更长的列来进行。 最后整个表就只有一列 将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序 ''' def shellSort(a): pass if __name__ == '__main__': sortAndAssert(shellSort)