def left_rotation(T, x): y = x.right x.right = y.left if y.left != T.nil: y.left.p = x if x.p == T.nil: T.root = y elif x == x.p.left: x.p.left = y else: x.p.right = y x.p = y y.left = x
* 右旋(right-rotation)
def right_rotation(T, x): y = x.p y.left = x.right if x.right != nil: x.right.p = y if y.p == T.nil: T.root = x elif y.p.left == y: y.p.left = x else: y.p.right = x x.right = y y.p = x
defsort_merge(lista): defcompare(A, B): #步骤2 result = [] i, j = 0, 0 while i < len(A) and j < len(B): if A[i] < B[j]: result.append(A[i]) i += 1 else: result.append(B[j]) j += 1 result.extend(A[i:]) result.extend(B[j:]) return result
defmerge(lista): #步骤1,将数组分为2个数组A,B iflen(lista) == 1: return lista else: mid = len(lista) // 2 left = merge(lista[:mid]) right = merge(lista[mid:]) return compare(left, right) return merge(lista)
defsort_bubble(lista): length = len(lista) for i in xrange(length-1): for j in xrange(i, length-1): if lista[j] > lista[j+1]: #如果左边大于右边,交换位置 lista[j], lista[j+1] = lista[j+1], lista[j] return lista
4.选择排序
思路:
类似于冒泡排序,但是循环的时候是找出最小的数值,与循环的起始位置交换顺序
defsort_selection(lista): length = len(lista) for i in xrange(length - 1): minum = i for j in xrange(i, length): if lista[j] < lista[minum]: minum = j lista[i] = lista[minum] return lista
defsort_heap(lista): defFather(i): # 父节点 i的一半向下取整 └ i/2 ┘ return (i+1)//2 - 1 defLeft(i): # 左孩子节点 return (i+1)*2 - 1 defRight(i): # 右孩子节点 return (i+1)*2 + 1 - 1 defmax_heapify(A, i): # 维护最大堆的性质 global heap_size l = Left(i) r = Right(i) lastest = i if l <= heap_size and l > A[lastest]: lastest = l if r <= heap_size and r > A[lastest]: lastest = r if lastest != i: A[i], A[lastest] = A[lastest], A[i] max_heapify(lastest)
defbuild_max_heap(A): # 生成最大堆 global heap_size heap_size = len(A) - 1 for i in xrange(len(A)//2, -1, -1): max_heapify(A, i)
defheap_sort(A): #排序 global heap_size build_max_heap(A) for i in xrange(len(A) - 1, 0, -1): A[0], A[i] = A[i], A[0] max_heapify(A, 0) heap_sort(lista) return lista
defsort_count(lista): k = max(lista) + 1 length = len(lista) B = [0] * k # 临时存储 C = [0] * length # 输出 for i in lista: B[i] = B[i] + 1 for i in xrange(1, k): B[i] = B[i] + B[i-1] for i in xrange(length - 1, -1, -1): C[B[lista[i]] = lista[i] B[lista[i]] = B[lista[i]] - 1 return C