【问题标题】:Heap Sort ,index of array starting 1 instead of 0堆排序,数组的索引从 1 开始而不是 0
【发布时间】:2020-09-18 18:20:28
【问题描述】:
#include<stdio.h>

int swap(int *a,int *b){

int tmp;

 tmp=*a;
*a=*b;
*b=tmp;

}

void heapify(int a[],int n,int i){

int largest =i;
int left=2*i+1;
int right=2*i+2;

while(left<=n&&a[left]>a[largest]){
    largest=left;
 }

while(right<=n&&a[right]>a[largest]){
    largest=right;
 }

if(largest!=i){
swap(&a[largest],&a[i]);
heapify(a,n,largest);
 }

}

int heapSort(int a[],int n){

int i;

for(i=n/2-1;i>=0;i--){
  heapify(a,n,i);
 }

for(i=n;i>=0;i--){
    swap(&a[0],&a[i]);
    heapify(a,n,0);

 }

}

 void printlist(int A[],int len){

int i;

for(i=0;i<len;i++){
    printf(" %d",A[i]);
 }
 printf("\n");
}

int main(){


int a[]={1,5,4,6,3,9,7};
int len=sizeof(a)/sizeof(a[0]);

printf("before :");
printlist(a,len);
heapSort(a,len-1);
printf("after:");
printlist(a,len);

}

由于堆排序中数组的索引从 1 开始,我通过更改 i、left、right 的值手动将其更改为 0....

但是问题还是会出现

这是输出: 之前:1 5 4 6 3 9 7 之后:9 7 6 4 5 3 1

肯定有一些我没有注意到的错误,谢谢帮助!!

ps:谁能推荐一个很酷的链接,不能发现代码的错误或错误,会很好。

【问题讨论】:

  • 你说问题依然存在,但是你没有说问题是什么。你有什么问题?
  • 输出仍然不在排序列表中,但我找不到,错误在哪里。
  • 贴出的代码包含两个主要问题。这两个问题都是由于能够退出函数,这不是“无效”函数,而是无法返回已知值。这些函数是:swap()heapSort()。因此,发布的代码包含未定义的行为。请纠正这些问题
  • OT: about: int swap( int *a, int *b ) 所有对swap() 的调用不使用返回值,所以这个签名应该是:void swap( int *a, int *b )
  • OT:关于int heapSort(int a[],int n) 调用此函数的代码均未使用返回值。所以函数签名应该是:void heapSort(int a[],int n)

标签: c heap heapsort


【解决方案1】:

问题出在这里:

for(i=n;i>=0;i--){
    swap(&a[0],&a[i]);
    heapify(a,n,0);

}

heapify 的调用仍在使用整个堆。您需要将其更改为 heapify(a, i-1, 0)

另外,在您的 heapify 函数中,您有:

while(left<=n&&a[left]>a[largest]){
    largest=left;
 }

while(right<=n&&a[right]>a[largest]){
    largest=right;
 }

这些不需要是while 语句,因为循环体永远不会执行超过一次。例如,如果在第一个中执行主体,则执行largest == left,并且a[left] &gt; a[largest] 不可能在下一次评估为真。这些都可以是if 语句。

【讨论】:

  • 数组长度 7,在 len -1 之后,即 6,我根据 array=[1,5,4,6,3,9,7] 在 i=n 开始 heapify /2-1 ,即 i=2,因为它是最后一个有 2 个孩子的节点,如果我没记错的话,假设 heapify 从 i=2 开始?
  • @JohnTang 我最初的回答是错误的。请在我更新后重新阅读。
  • 现在我知道错在哪里了。我已经修改了我的代码并重新运行,它运行良好,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多