我正在尝试实现Cormen中提供的堆排序算法。我的代码如下:
#include<stdio.h>
#include<conio.h>
void max_heapify(int *,int);
void build_max_heap(int *,int);
void heapsort(int *,int);
void swap(int,int);
int heapsize;
int main()
{
int *arr,n,i;
printf("Enter no. of elements = ");
scanf("%d",&n);
arr=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
printf("Enter array elements = ");
scanf("%d",&arr[i]);
}
//heapsize = n;
heapsort(arr,n);
printf("\nAfter heapsort \n");
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
void heapsort(int *arr,int len)
{
int i;
build_max_heap(arr,len);
for(i= len-1;i>=1;i--)
{
swap(&arr[0],&arr[i]);
heapsize = heapsize -1;
max_heapify(arr,0);
}
}
void max_heapify(int *arr,int i)
{
int l=2*i,r=2*i+1,largest;
if(l<heapsize && arr[l]>arr[i])
largest = l;
else
largest = i;
if(r<heapsize && arr[r]>arr[largest])
largest = r;
if(largest != i)
{
swap(&arr[i],&arr[largest]);
max_heapify(arr,largest);
}
}
void build_max_heap(int *arr,int len)
{
heapsize = len;
int i;
for(i =len/2;i>=0;i--)
{
max_heapify(arr,i);
}
}
void swap(int *a ,int *b)
{
int temp = *a;
*a= *b;
*b= temp;
}
我无法弄清楚我的代码到底出了什么问题。数组没有得到排序。实际上原始数组正在打印。我哪里错了?
答案 0 :(得分:5)
您的swap
函数按值获取参数。因此复制原始值并交换副本而不是原件。
swap( int *a, int *b)
答案 1 :(得分:2)
1)修复掉期,你正在经过价值。这意味着在调用swap之后没有任何改变!
2)max_heapify功能错误。您的左右子计算关闭1.当您交换时,您将索引与数组值交换,为yikes。
3)heapsort for-loop是错误的。您应该将第一个元素(堆中最大的一个)放到当前堆的最后一个索引中,减小堆的大小,这样最后一个元素就是排序列表的一部分而不是堆。然后你从根,而不是从最后一个元素,下来。应该是:
for(i= len-1;i>=1;i--)
{
swap(arr[0],arr[i]);
heapsize = heapsize -1;
max_heapify(arr,0);
}
答案 2 :(得分:1)
您发现您的数组根本没有排序。尝试以增量方式处理完整的堆排序。因此,作为一种调试技术,创建此代码的副本并使用冒泡排序替换heapsort。 (泡泡排序更容易编码)。获取冒泡排序,包括传递参数并在排序之前和之后打印数组。
然后进行堆排序。
答案 3 :(得分:1)
Cormen中列出的算法似乎有误。 只需更改代码中的以下行:
max_heapify(ARR,0); \在heapsort功能
与
build_max_heap(ARR,堆大小);