堆排序

来源:互联网 发布:jenkins windows安装 编辑:程序博客网 时间:2024/06/01 10:42

当所有的非叶子节点大于等于两个儿子节点的关键字时,这样的堆叫做大顶堆。当所有的非叶子节点小于等于两个儿子节点的关键字时,这样的堆叫做小顶堆。

堆排序:将array[0..n-1]建成一个大顶堆,称为初始堆。将array[0]和array[n-1]互换。由于交换后的array[0]可能违反堆的性质,故将array[0..n-2]再调节成堆。然后再次将array[0]和array[n-2]互换,同样的再将array[0..n-3]调整成堆,直到数组中只剩下一个元素为止。

#include<stdio.h>int count = 1;void Restore(int *array, int i, int n);void HeapSort(int *array, int n) {    int i, t;    for (i = n / 2; i > 0; i--)        Restore(array, i, n);    for (i = n - 1; i > 0; i--) {        t = *(array + i + 1);        *(array + i + 1) = *(array + 1);        *(array + 1) = t;        Restore(array, 1, i);    }}void Restore(int *array, int i, int n) {    int j, k, r;    int done = 0;    k = r = *(array + i);    j = 2 * i;    while ((j <= n) && (done == 0)) {        if (j < n) {            if (*(array + j) < *(array + j + 1))                j++;        }        if (k >= *(array + j))            done = 1;        else {            *(array + j / 2) = *(array + j);            j *= 2;        }    }    *(array + j / 2) = r;}void main() {    int i;    int array[11] = { 0,23,21,25,42,76,54,82,69,11,3 }; //array[0]不起作用    printf("待排序数组:");    for (i = 1; i < 11; i++)        printf("%d ", *(array + i));    getchar();    HeapSort(array, 10);    printf("\n堆排序后数组为:");    for (i = 1; i < 11; i++)        printf("%d ", *(array + i));    printf("\n\n");}
0 0
原创粉丝点击