用c ++编写的heapsort实现

时间:2011-10-02 09:41:21

标签: c++ heapsort

我有以下代码用于heapsort

#include <iostream>
using namespace std;
void exch(int a[],int i,int j){
      int s=a[i];
      a[i]=a[j];
      a[j]=s;
        }
void sink(int a[],int k,int n){
 //int n=sizeof(a)/sizeof(int);
 while(2*k<=n){
  int j=2*k;
  if (j<n && (a[j]<a[j+1])) j++;
  if (a[k]>=a[j]) break;
  exch(a,k,j);
  k=j;


 }
   }


  void heapsort(int a[]){
   int n=sizeof(a)/sizeof(int);
    for (int k=n/2;k>=1;k--)
             sink(a,k,n);
    while(n>1){
     exch(a,1,n--);
                sink(a,1,n);


    }

        }
int main(){

    int  a[]={12,3,5,1,67,10,9.20};
    int n=sizeof(a)/sizeof(int);
    heapsort(a);

           for (int i=0;i<n;i++){
            cout<<a[i]<<"  ";


           }
              return 0;


}

但结果显示我看起来像这样

12  3  5  1  67  10  9  Press any key to continue . . .

同样看看我的数组总数是8,这里它显示了7作为输出,我认为这个问题的核心应该是这个

1>c:\users\datuashvili\documents\visual studio 2010\projects\heap\heap\heap.cpp(36): warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data

在从double转换为int force代码时,可能会丢失数据,但是我是对还是错?请帮帮我

3 个答案:

答案 0 :(得分:4)

您在9到20之间写了.而不是,

int  a[]={12,3,5,1,67,10,9.20};

这导致7个数字,其中最后一个是double 9.20,它被转换为int

此外,此代码错误:

void heapsort(int a[]){
    int n=sizeof(a)/sizeof(int);

数组参数实际上是作为指针传递的,因此sizeof(a)不会为您提供正确的结果。您应该将数组大小作为附加参数传递。

答案 1 :(得分:4)

我可以立即看到的一个问题是:

void heapsort(int a[]){
   int n=sizeof(a)/sizeof(int);

您无法将整个数组作为参数传递给C / C ++中的函数。参数语法int a[]当然令人困惑,但事实上它等同于int* a。 heapsort()无法知道a指向的数组的大小。您必须将大小作为单独的参数传递。

答案 2 :(得分:3)

除了所有其他注释(sizeof(a),将[]作为参数传递,在init-list中有.)之外,您还想编写C ++代码,对吧?但它看起来很C'ish,除了iostream。 Thereore:

  • 使用std::vector<int>中的#include <vector>(例如,添加push_back元素)
  • 将其作为参考传递,即void heapsort(std::vector<int> &a)
  • 考虑使用std::swap( a[i], a[j] );代替exch