c - 堆排序 heapify sort

标签 c sorting heapsort

我有一个关于堆排序的问题。我不知道我的代码有什么问题。该程序仅更改了表中的第二个和最后一个位置。这是我的代码(没有主要功能):

   #include<stdio.h>
#define DUZO 100000000
int heap_size;
int tab[DUZO];

void heapify(int start){
    int l, r, largest, pom;

    l = 2*start + 1;
    r = 2*start + 2;

    if((l < heap_size) && (tab[l] > tab[start]))
        largest = l;
    else
        largest = start;

    if((r <  heap_size) && (tab[r] > tab[largest]))
        largest = r;
    if(largest != start){
        pom = tab[start];
        tab[start] = tab[largest];
        tab[largest] = pom;

        heapify(largest);
    }
}

void build_max(){
    int lenght, i;
    lenght = heap_size;

    for(i = ((lenght - 1)/2); i >= 0; --i){
        heapify(i);
    }
}

void heap_sort(){
    int i;
    build_max();


    for(i = heap_size-1; i > 0; --i) {
        int tmp = tab[0];
        tab[0] = tab[i];
        tab[i] = tmp;
        --heap_size;
        heapify(0);
    }
}

感谢您的帮助。

最佳答案

int heap_size = 6;
int tab[5];

这要求在数组末尾写入(和读取),从而导致未定义的行为,并可能产生不良后果。

将堆大小和数组作为全局变量是一个坏主意,它们应该是函数的参数。

l = 2*start + 1;
r = 2*start + 2;

这是当堆顶部位于索引 0 时的索引,但是

if((l <= heap_size) && (tab[l] > tab[start]))

如果堆顶部位于索引 1,则将使用该检查。对于索引 0,应该是 < (也在接下来的检查中 r )。

void build_max(){
    int lenght, i;
    lenght = heap_size;

    for(i = ((lenght - 1)/2); i > 0; i--){
        heapify(i);
    }
}

忘记堆化顶部,因此通常不会创建堆,条件应该是 i >= 0 .

void heap_sort(){
    int i, lenght;
    build_max();
    lenght =  heap_size;

    for(i = lenght; i > 1; i--){
        heap_size -= 1;
        heapify(i);
    }
}

不会交换堆顶部的最后一个位置,因此它根本不排序。循环应该看起来像

for(i = heap_size-1; i > 0; --i) {
    /* swap top of heap in the last position */
    int tmp = tab[0];
    tab[0] = tab[i];
    tab[i] = tmp;
    --heap_size; /* urk, but what can we do if heapify uses the global? */
    heapify(0);  /* we need to heapify from the top, since that's where the leaf landed */
}

对数组进行实际排序。

关于c - 堆排序 heapify sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786830/

相关文章:

algorithm - 给出一个测试用例,其中堆排序从 Introduction to Algorithm 失败

c++ - 添加断点并运行程序时无法访问地址处的内存

c - 对 C 中字符串数组的最后一列进行排序

objective-c - NSArray 反向索引排序

javascript - 需要了解 Javascript Array.sort() 函数

c - 堆排序无法正常工作

java - 使用 'extract' 方法迭代地从最小堆中删除最小元素并复制到指定的 arrayList 作为获取排序列表的方法

c - 当此代码中数组大小未初始化时,为什么 gcc o 不发出警告?

c - 指针算术很难吗?

java - 如何对多个元素上的 Vector<Vector<String>> 进行排序,将子项分组在一起?