我有一个问题巫婆堆排序。我不知道我的代码有什么问题。该程序仅更改了表格中的第二个和最后一个位置。这是我的代码(没有主要功能):
#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);
}
}
感谢您的帮助。
答案 0 :(得分:1)
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 */
}
实际排序数组。