RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 576919
Accepted
E1mir
E1mir
Asked:2020-10-12 19:03:50 +0000 UTC2020-10-12 19:03:50 +0000 UTC 2020-10-12 19:03:50 +0000 UTC

为什么数组没有排序?

  • 772

下午好!我正在用 C++ 训练排序算法,我遇到了以下问题:

我创建了一个由我通过键盘X给出的元素组成的数组。X这一切都在方法中完成main()

int length;
cout << "How many elements do you want to add? Type here: ";
cin >> length;
int array[length];

输入后,我用长随机数X填充我的数组。X并在屏幕上显示:

cout << "Your current array is:\n\n";
for(int i = 0; i < length; i++){
array[i] = rand() % 100;
printf("%d ", array[i]);
}

好吧,在那之后我们看到一个未排序的数组..

接下来,我创建一个方法,将我们的数组和我的元素作为参数,并使用 bubble 方法对其进行排序

void sort(int array[]){
    int length, temp, j;
    length = sizeof(array) / sizeof(*array);
    bool sort = true;
    while(sort){
        j++;
        sort = false;
        for(int i = 0 ; i < length - j; i++){
            if (array[i] > array[i+1]){
                temp = array[i];
                array[i] = array[i+1];
                array[i+1] = temp;
                sort = true;
            }
        }
    }
}

好吧,在main()我调用这个方法的方法中..

main(){
    //declare array
    sort(array);
    //output after sorting
}

但是当我运行程序时,我发现我的数组没有排序。我的错误在哪里?我知道,如果您用 Java 编写这样的实现,那么它就可以工作。但是正如我刚刚理解的那样,在 C++ 中则需要不同的方式。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Vlad from Moscow
    2020-10-12T19:32:23Z2020-10-12T19:32:23Z

    C++ 不支持变长数组。有单独的编译器有自己的 C++ 语言扩展,包括此支持,但最好不要依赖它。所以这段代码

    int length;
    cout << "How many elements do you want to add? Type here: ";
    cin >> length;
    int array[length];
    

    不符合C++标准。

    您应该动态分配数组。例如,

    int *array = new int[length];
    

    并在程序结束时将其删除。

    delete [] array;
    

    当数组作为函数参数按值传递时,它会隐式转换为指向其第一个元素的指针。因此,这个函数声明

    void sort(int array[]);
    

    等价于下面的函数声明

    void sort(int *array);
    

    并声明相同的功能。

    在这个函数里面

    void sort(int array[]){
        int length, temp, j;
        length = sizeof(array) / sizeof(*array);
        //...
    

    句子

        length = sizeof(array) / sizeof(*array);
    

    并不像您想象的那样计算数组中元素的数量。相当于下面这句话

        length = sizeof( int * ) / sizeof( int );
    

    例如,如果指针大小sizeof( int * ) 为 8,大小sizeof( int )为 4,则结果将为 2。

    您应该将函数声明为

    void sort( int array[], int length );
    

    或者更好的是如何

    void sort( int array[], size_t length );
    

    对于冒泡排序,请参阅我对 SO 的回答。此外,您 在函数中使用了未初始化的变量j,这会导致程序出现未定义的行为

    int length, temp, j;
                     ^^^
    length = sizeof(array) / sizeof(*array);
    bool sort = true;
    while(sort){
        j++;
        ^^^^
    

    请注意,不带参数的主函数必须在 C++ 中声明为

    int main()
    ^^^
    
    • 6
  2. yrHeTateJlb
    2020-10-12T19:52:50Z2020-10-12T19:52:50Z

    正如您可能已经猜到的那样,您的主要(但不仅是)问题是您错误地计算了数组的大小。如果将变量值的输出写入控制台length,您会立即看到这一点。例如,对我来说,它总是等于二。

    现在怎么处理。您现在实质上是将指向数组开头的指针传递给函数。在这种情况下无法获取元素的数量。

    你已经找到了一条出路。将指针传递给开始和大小:

    void sort(int *array, int size){
    //...
    }
    
    int main(){
        int arr[] = {1, 2, 3, 4};
        sort(arr, sizeof(arr)/sizeof(int));
    }
    

    您可以按照标准库的样式执行此操作,并将指针传递给第一个元素和最后一个元素之后的下一个元素:

    void sort(int *begin, int *end){
    //...
    }
    
    int main(){
        int arr[4] = {1, 2, 3, 4};
        sort(&arr[0], &arr[4]);
    }
    

    请注意,它&arr[4]返回一个指向不存在的元素的指针。它不能被取消引用。但是为了标记数组的结尾,它会完美贴合。

    好吧,硬汉的方式:)。链接到数组+模板:

    template<int size>
    void sort(int (&array)[size]){
    //...
    }
    
    int main(){
        int arr[] = {1, 2, 3, 4};
        sort(arr);
    }
    

    我敢肯定在初始阶段你不应该理会这个头,但你必须承认,它看起来很酷。编译器本身推导出数组的大小,我们甚至不需要做任何事情。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5