我有以下代码用于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代码时,可能会丢失数据,但是我是对还是错?请帮帮我
答案 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