c ++排序算法难以处理数组长度

时间:2015-08-13 15:47:51

标签: c++ arrays sorting

我在Xcode上用C ++编写一个简单的Bubblesort算法时遇到了麻烦。一个特殊的问题是得到数组的长度,我得到一个错误说"数组函数的sizeof将返回int *的大小而不是int []。"这是什么意思?我试图在数组{33,60,55,8,26}上测试算法,但对如何构造数组长度函数感到困惑。

  #include <iostream>
#include <array>
using namespace std;
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))

void swap(int n1, int n2){
    int temp = n1;
        n1 = n2;
        n2 = temp;
}
int count(int a[]){
    int len=0;
    for(int i = 0; i <= 20; i++){
        if(a[i] >= 0){
            len++; //len=len+1
        }
    }
    return len;
}
template <size_t N>
void BubbleSort( int a[], size_t len ){
     for(int i = 0;i <= len;i++){
         if(a[i] > a[i+1]){
             swap(a[i],a[i+1]);
         }
     }
 }
void printr(int arr[]){
    for(int i = 0; i <= len; i++){
        cout<<arr[i]<<"\n";
    }
}
int main(int argc, const char * argv[]) {
    int arr[] = {33,60,55,8,26};
    BubbleSort(arr, ARRAY_SIZE(arr));
    printr(arr);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

此时:

void BubbleSort( int a[] ){

a[]的大小未知。出于所有意图和目的,它是int *。您需要计算数组的已知长度,并将其传递给,例如

void BubbleSort( int a[], size_t len ){

称为:

int arr[] = {33,60,55,8,26};
BubbleSort(arr, ARRAY_SIZE(arr));

答案 1 :(得分:1)

#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))

当应用于int[]时,sizeof(array[0])变为sizeof(int),但sizeof(array)变为sizeof(int*)(与sizeof(int[])相同)。数组长度不存在:您需要单独存储它。

您应该使用std::vector<>容器和标准库中的std::sort函数。

顺便说一下,BubbleSort函数,即使它的有效值为len(例如,作为另一个函数参数),也是错误的。尝试排序{4,3,2,1}:您需要两个嵌套循环。

答案 2 :(得分:0)

此功能,以及您示例中的类似功能:

void BubbleSort(int a[])

完全等同于将它们定义为:

void BubbleSort(int* a)

你只是拿指针。您无法仅通过指针确定数组的大小 - 那里的信息不足。 C方法是在各处传递大小:

void BubbleSort(int* a, size_t len)

但是在C ++中,我们可以通过推导数组大小来做得更好:

template <size_t N>
void BubbleSort(int (&a)[N]) // N is the length of the array

虽然更好的方法是使用std::vector,这将使一切变得更容易处理:

void BubbleSort(const std::vector<int>& a) // a.size() is the length