Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中实现堆排序时遇到的问题_C_Algorithm_Unix_Heap_Heapsort - Fatal编程技术网

在C中实现堆排序时遇到的问题

在C中实现堆排序时遇到的问题,c,algorithm,unix,heap,heapsort,C,Algorithm,Unix,Heap,Heapsort,我正在用C语言实现经典的堆排序算法。我已经盯着这段代码看了好几个小时了,仍然无法找出我一生中的错误。输入3 1 2 7 4 0 2运行良好并生成正确的堆,但当我在末尾添加8时(并将大小增加1)。它不再产生堆。有什么想法吗?我认为这只是一个愚蠢的错误。供参考 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大ARR 1024 无效构建堆(int*fn,int len); void heapify(int*f,int n,int size); 无效验证_关系(int*f,int n)

我正在用C语言实现经典的堆排序算法。我已经盯着这段代码看了好几个小时了,仍然无法找出我一生中的错误。输入3 1 2 7 4 0 2运行良好并生成正确的堆,但当我在末尾添加8时(并将大小增加1)。它不再产生堆。有什么想法吗?我认为这只是一个愚蠢的错误。供参考

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大ARR 1024
无效构建堆(int*fn,int len);
void heapify(int*f,int n,int size);
无效验证_关系(int*f,int n);
无效打印(整数n[],整数);
无效掉期(int*a、int*b);
无效堆排序(int*a,int len);
int main(int argc,字符**argv){
/*输入有效--3 1 2 7 4 0 2*/
/*输入中断--3 1 2 7 4 0 2 8*/
int nums[100]={3,1,2,7,4,0,2,8};
int len=8;
构建堆(nums,len);
验证_关系(NUM、len);
打印(nums,len);
返回0;
}
无效堆排序(int nums[],int len){
int i;
构建堆(nums,len);
对于(i=len;i>0;--i)
{
掉期(&nums[1],&nums[i]);
heapify(nums,1,len);
}
}
无效构建堆(int*nums,int len){
int size=len,i;
对于(i=size;i>=0;i--){
heapify(nums,i,size);
}
}
void heapify(int f[],int n,int size){
int left=2*n,
右=2*n+1,
最大值=0;
如果(左=f[n])
最大=左;
其他的
最大=n;
如果(右=f[最大])
最大=右;
如果(最大!=n){
掉期(&f[n]、&f[maximust]);
heapify(&n,最大,大小);
}
}
无效交换(int*a,int*b){
int temp=*a;
*a=*b;
*b=温度;
}
无效验证_关系(int a[],int n){
如果(a[0]>=a[1]&&a[0]>=a[2])
printf(“True-'%d>=%d&&%d>=%d'\n”,a[0],a[1],a[0],a[2]);
其他的
printf(“假”);
如果(a[1]>=a[3]&&a[1]>=a[4])
printf(“True-'%d>=%d&&%d>=%d'\n”,a[1],a[3],a[1],a[4]);
其他的
printf(“假”);
如果(a[2]>=a[4]&&a[2]>=a[5])
printf(“True-'%d>=%d&&%d>=%d'\n”,a[2],a[4],a[3],a[5]);
其他的
printf(“假”);
}
无效打印(整数n[],整数){
INTC;
对于(c=0;c
线路

heapify(&n, largest, size);
应该是

heapify(f, largest, size);
        ^
线路

heapify(&n, largest, size);
应该是

heapify(f, largest, size);
        ^

除了识别出的主要错误之外,您还应该让
verify\u relations()
代码更彻底,因为它不会验证整个堆

在数组索引基于1的堆中(而不是像C中那样基于0),然后对于每个元素
a[i]
,如果相应的元素
a[i*2]
存在,则
a[i]堆[node2])
{
rc=堆_失败;
printf(“%s:堆[%d]=%d和堆[%d]=%d之间的堆关系不成立\n”,
标记,节点1,堆[node1],节点2,堆[node2]);
}
返回rc;
}
/*报告每一次违规行为*/
静态int-verify_关系1(常量int*堆,int-size)
{
int rc=HEAP_OK;
对于(int i=0;i=大小)
打破
int rv=cmp_heap_元素(heap,i,i*2+1,“R1”);
如果(rc==HEAP\u OK)
rc=rv;
如果(2*i+2>=大小)
打破
rv=cmp_堆元素(堆,i,i*2+2,“R1”);
如果(rc==HEAP\u OK)
rc=rv;
}
返回(rc);
}
/*关于首次违规的报告-未对其他违规行为进行诊断*/
静态int-verify_关系2(常量int*堆,int-size)
{
对于(int i=0;i=大小)
break;//或:返回(HEAP\u OK);
if(cmp\u堆元素(堆,i,i*2+1,“R2”)!=heap\u确定)
返回(堆失败);
如果(2*i+2>=大小)
break;//或:返回(HEAP\u OK);
if(cmp\u堆元素(堆,i,i*2+1,“R2”)!=heap\u确定)
返回(堆失败);
}
返回(HEAP_OK);
}
静态无效打印堆(常量int*堆、int大小、常量char*标记)
{
printf(“%s:”,标记);
对于(int i=0;i对于(int size=1;size,除了已识别的主要bug之外,您应该让
verify_relations()
代码更彻底,因为它不会验证整个堆

在数组索引基于1的堆中(而不是像C中那样基于0),然后对于每个元素
a[i]
,如果相应的元素
a[i*2]
存在,则
a[i]堆[node2])
{
rc=堆_失败;
printf(“%s:堆[%d]=%d和堆[%d]=%d之间的堆关系不成立\n”,
标记,节点1,堆[node1],节点2,堆[node2]);
}
返回rc;
}
/*报告每一次违规行为*/
静态int-verify_关系1(常量int*堆,int-size)
{
int rc=HEAP_OK;
对于(int i=0;i=大小)
打破
int rv=cmp_heap_元素(heap,i,i*2+1,“R1”);
if(rc)