Python 实现快排、堆排

Python 实现快排、堆排


1、快排

原理:(升序)

  1. 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空;
  2. 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为空;
  3. 从左到右和中间值对比,找到第一个大于中间值的元素,把该值放到右边的空位,该位置变为空;
  4. 重复步骤2和3,直到左右空位相交,然后把缓存的中间值填入该位;
  5. 从第4步骤的左右空位相交位为界,分左右两边重复1-4步骤,直到需要排序数组的长度≤1;

程序代码:

# 快排
def quick_sort(A, l, r):
    if l < r:
        pivot = A[l]
        left = l
        right = r
        while left < right:
            while A[right] > pivot and left < right:
                right -= 1

			# 左右不能相等,相等的话会进行移动,导致数组越界
            if left < right:
                A[left] = A[right]
                left += 1

            while A[left] <= pivot and left < right:
                left += 1

            if left < right:
                A[right] = A[left]
                right -= 1

        A[left] = pivot
        quick_sort(A, l, left-1)
        quick_sort(A, left+1, r)


if __name__ == '__main__':
    S = [0, 2, 1, 6]
    quick_sort(S, 0, 3)
    print(S)

2、堆排

原理(用数组表示完全二叉树的层序,最小堆):

  1. 从最后一个叶子节点的父节点开始,比较该节点与子节点的大小;
  2. 如果父节点是最小值,继续比较前面的节点;如果父节点不是最小值,父节点与最小值节点交换位置,并且考虑该变换对最小值节点的子节点的影响;
  3. 直到比较到根节点

程序代码:

# 堆排
def heap_sort(A):
    for i in range((len(A) - 1) // 2, -1, -1):
        while i < len(A):
            # 子节点与父节点的位置关系
            left, right = i * 2 + 1, i * 2 + 2
            min_pos = i
            if (left < len(A)) and (A[left] < A[min_pos]):
                min_pos = left
            if (right < len(A)) and (A[right] < A[min_pos]):
                min_pos = right
            # 如果最小值的位置改变了,需要考虑这个改变带来的影响
            if min_pos != i:
                A[i], A[min_pos] = A[min_pos], A[i]
                i = min_pos
            else:
                break


if __name__ == '__main__':
    S = [4, 3, 2, 1]
    heap_sort(S)
    print(S)

GOOD LUCK!


你可能感兴趣的:(Python)