堆排序(下标0/1)
- 0 这里的n指的是数组的长度
- void SiftHeap(int r[], int k, int n) {
- int i = k;
- int j = 2 * i + 1; // 置i为要筛的结点,j为i的左孩子
- while (j < n) { // 筛选还没有进行到叶子
- if (j + 1 < n && r[j] < r[j + 1]) j++; // 比较i的左右孩子,j为较大者
- if (r[i] >= r[j]) // 根结点已经大于或等于左右孩子中的较大者
- break;
- else {
- swap(r[i], r[j]); // 将根结点与结点j交换
- i = j;
- j = 2 * i + 1; // 更新i和j,继续向下筛选
- }
- }
- }
- void HeapSort(int r[], int n) {
- // 初始化堆
- for (int i = (n/ 2)-1 ; i >= 0; i--) {
- SiftHeap(r, i, n);
- }
- // 排序过程
- for (int i = n - 1; i > 0; i--) {
- swap(r[0], r[i]); // 交换堆顶元素(最大值)与最后一个未排序的元素
- SiftHeap(r, 0, i); // 调整剩余部分的堆
- }
}
1
- void SiftHeap(int r[], int k, int n) {
- int i = k;
- int j = 2 * i; // 置i为要筛的结点,j为i的左孩子
- while (j <= n) { // 筛选还没有进行到叶子
- if (j < n && r[j] < r[j + 1]) j++; // 比较i的左右孩子,j为较大者
- if (r[i] >= r[j]) // 根结点已经大于或等于左右孩子中的较大者
- break;
- else {
- swap(r[i], r[j]); // 将根结点与结点j交换
- i = j;
- j = 2 * i; // 更新i和j,继续向下筛选
- }
- }
- }
- void Swap(int &a, int &b) {
- int temp = a;
- a = b;
- b = temp;
- }
- void HeapSort(int r[], int n) {
- // 初始化堆
- for (int i = n / 2; i >= 1; i--) {
- SiftHeap(r, i, n);
- }
- // 排序过程
- for (int i = n; i > 1; i--) {
- Swap(r[1], r[i]); // 交换堆顶元素(最大值)与最后一个未排序的元素
- SiftHeap(r, 1, i - 1); // 调整剩余部分的堆
- }
- }

浙公网安备 33010602011771号