排序之堆排序
2018 algorithm堆排序可以分成两步,一:将给定的数组建立成堆。 二:不断的移除根节点,然后重组堆。并移除的根节点插入到数组中。
图片来源:维基百科
堆的定义
关于堆的定义,可以查看数据结构之堆
特点
- 堆排序是一种不稳定的排序。
- 堆排序的时间复杂度为 O(nlogn)。
- 堆排序的空间复杂度为 O(1)。
堆排序的伪代码:
ALGORITHM heapSort(A) is
buildHeap(A, length(A) - 1)
FOR i ← length(A) - 1 downto 1
swap A[0] and A[i]
heapify(A, 0, i-1)
END FOR
END ALGORITHM
建立最大堆的伪代码:
ALGORITHM buildHeap(A, hi) IS
FOR i ← hi/2 - 1 downto 0
heapify(A, i, hi)
END FOR
END ALGORITHM
最大堆调整heapify的伪代码:
// 递归法
ALGORITHM heapify(A, lo, hi) is
maxIndex ← lo
l ← 2 * lo + 1
r ← 2 * lo + 2
IF l <= hi and A[l] > A[maxIndex]
maxIndex ← l
END IF
IF r <= hi and A[r] > A[maxIndex]
maxIndex ← r
END IF
IF maxIndex != lo
swap A[lo] and A[maxIndex]
heapify(A, maxIndex, hi)
END IF
END ALGORITHM
// 循环迭代法
ALGORITHM heapify(A, lo, hi) IS
temp ← A[lo]
j ← 2 * lo + 1
WHILE j <= hi
IF j < hi and A[j] < A[j+1]
j ← j + 1
END IF
IF temp >= A[j]
break
END IF
A[lo] = A[j]
lo ← j
j ← 2 * j + 1
END WHILE
A[lo] ← temp
END ALGORITHM