常见排序算法及其C语言实现(二)

堆的基本操作及堆排序

void siftup(int *H, int i); //关于堆,所有的位置计算都从1开始。包括n代表个数。
void siftdown(int *H, int n, int i); //因此在数组操作的时候都要减一,其它位置均表示个数
void makeheap(int *H, int n);
void heapsort(int *A, int n);
void heapdelete(int *H, int n, int i);//默认n大于i,基本思想是和H[n]互换
void heapinsert(int *H, int n);//基本思想也是和H[n]互换

void heapdelete(int *H, int n, int i) { 
    int x, y;
    x = A[i - 1];
    y = A[n - 1];
    A[i - 1] = A[n - 1];
    if (y > x) {
        siftup(A, i);
    } else {
        siftdown(A, n - 1, i);
    }
}

void heapsort(int *A, int n) {
    makeheap(A, n);
    int j, temp;
    for (j = n; j > 1; j--) {
        temp = A[1-1];
        A[1 - 1] = A[j - 1];
        A[j - 1] = temp;
        siftdown(A, j-1, 1); //堆在缩小 
    }
}

void makeheap(int *H, int n) { //从下往上建堆
    for (int i = n / 2; i > 0; i--) {
        siftdown(H, n, i);
    }
}

void siftdown(int *H, int n, int i) { //将一个不正确的节点向下调整
    int temp;
    while (2 * i <= n) {
        i = 2 * i;
        if (i + 1 <= n) {
            if (H[i] > H[i-1])
                i = i + 1;
        }
        if (H[i / 2 - 1] < H[i-1]) {
            temp = H[i / 2 - 1];
            H[i / 2 - 1] = H[i - 1];
            H[i - 1] = temp;
        }
    }
}

void siftup(int *H, int i) { //将一个不正确的子节点向上调整
    int temp;

    while (i != 1) {
        if (H[i - 1] > H[i / 2 - 1]) {
            temp = H[i - 1];
            H[i - 1] = H[i / 2 - 1];
            H[i / 2 - 1] = temp;
            i = i / 2;
        }
        else {
            break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xtydtc/article/details/77093389