【读书笔记】排序算法

来源:互联网 发布:谷歌访问助手mac版 编辑:程序博客网 时间:2024/06/16 17:24

以下算法均对于数组A

插入排序
按从小到大排序

for i = 1 to A.length    key = A[i]    j = i - 1    while (j > 0 and A[j] > key)        A[j+1] = A[j]        j = j - 1    A[j+1] = key

堆排序

对于以1为开始的下标的数组,在二叉树的排列下,节点i的根节点和左右子节点为

PARENT(i) = i / 2LEFT(i) = 2 * iRIGHT(i) = 2 * i + 1

首先对于一个节点i,将以其为根节点的子树调整为最大堆的过程

MAX_HEAPIFY(A, i)    largest = i    l = LEFT(i)    r = RIGHT(i)    if l <= A.heap_size and A[l] > A[i]        largest = l    if r <= A.heap_size and A[r] > A[largest]        largest = r    if largest != i        exchange A[i], A[largest]        MAX_HEAPIFY(A, largest)

建堆
由于从n2+1n都是叶子节点,因此有

BUILD_MAX_HEAP(A)    for i = A.length / 2 downto 1        MAX_HEAPIFY(A, i)

堆排序

HEAP_SORT(A)    BUILD_MAX_HEAP(A)    for i = A.heap_size downto 1        exchange A[A.heap_size], A[1]        HEAPIFY(A, 1)        A.heap_size = A.heap_size - 1
0 0