def selection_sort(lists): length = len(lists) for i in range(length): min_index = i for j in range(i + 1, length): if lists[min_index] > lists[j]: min_index = j swap(lists, min_index, i) return lists
def bubble_sort(lists): length = len(lists) for i in range(length): for j in range( 0, length - i - 1, ): if lists[j] > lists[j + 1]: swap(lists, j, j + 1) return lists
def sort(cls, lists, *args): if len(args): left = args[0] right = args[1] if left >= right: return swap(lists, left, int(random.random() * (right - left + 1)) + left) base = lists[left] """ lists[left+1...lt] < v lists[gt...right] > v lists[lt+1...i) == v 保证初始化的三个区间全部为空 后续相应元素逐个添加进去 """ lt = left gt = right + 1 i = left + 1 while i < gt: if lists[i] < base: swap(lists, lt + 1, i) lt += 1 i += 1 elif lists[i] > base: swap(lists, gt - 1, i) gt -= 1 else: i += 1 swap(lists, left, lt) cls.sort(lists, left, lt - 1) cls.sort(lists, gt, right) else: cls.sort(lists, 0, len(lists) - 1)
def partition(lists, left, right): """ 选取第一个元素为标定点 lists[left+1...k] < base; lists[k+1...right] > base :param lists: :param left: :param right: :return: """ base = lists[left] k = left for i in range(left + 1, right + 1): if base > lists[i]: k += 1 swap(lists, k, i) swap(lists, left, k) return k
def insertion_sort(lists, *args): if len(args): for i in range(args[0] + 1, args[1] + 1): for j in range(i, 0, -1): if lists[j] < lists[j - 1]: swap(lists, j, j - 1) else: break else: length = len(lists) for i in range(1, length): for j in range(i, 0, -1): if lists[j] < lists[j - 1]: swap(lists, j, j - 1) else: break return lists
def partition(lists, left, right): # 随机标定点 # lists[left...l] < base; lists[r...right] >= base swap(lists, left, int(random.random() * (right - left + 1)) + left) base = lists[left] l = left + 1 r = right while True: while l <= right and lists[l] < base: l += 1 while r >= left + 1 and lists[r] > base: r -= 1 if l > r: break swap(lists, l, r) l += 1 r -= 1 """ 一次完整的遍历之后,l会停留在第一个大于base的位置,r会停留在第一个小于base的位置 故将base的值与lists[r]进行交换,完成一次partition """ swap(lists, left, r) return r
def partition(lists, left, right): """ 对于普通快排,若排序数组为近乎有序的 每次选取第一个元素为标定点则会将算法时间复杂度往O(n*2)提高,接近于最坏的处理情况 这种处理场景,随机快排能大幅度降低时间复杂度 lists[left+1...k] < base; lists[k+1...right] > base """ swap(lists, left, int(random.random() * (right - left + 1)) + left) base = lists[left] k = left for i in range(left + 1, right + 1): if base > lists[i]: k += 1 swap(lists, k, i) swap(lists, left, k) return k