在C中实现Cormen的HeapSort算法

时间:2013-08-12 07:42:25

标签: c algorithm sorting heapsort

我正在尝试实现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;
}

我无法弄清楚我的代码到底出了什么问题。数组没有得到排序。实际上原始数组正在打印。我哪里错了?

4 个答案:

答案 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,堆大小);