【问题标题】:wrong printed sorted array错误打印的排序数组
【发布时间】:2022-11-11 01:32:49
【问题描述】:

我是 C++ 新手,我一直在做气泡排序,但是当我想在终端中显示数字时,前导数字是个问题。对不起,我的英语不好顺便说一句。

我在哪里做错了?

这是代码:

#include <iostream>

void printArray(int *myArr, int lenght) {
    for (int i = 0; i < lenght; ++i) {
        std::cout << myArr[i] << ", ";
    }
}

int bubbleSort(int *myArr, int lenght) {
    for (int i = 0; i < lenght; ++i) {
        for (int j = 0; j < lenght-1; ++j) {
            if (myArr[j] > myArr[j+1]) {
                int temp = myArr[j];
                myArr[j] = myArr[j+1];
                myArr[j+1] = temp;
            }
        }
    }
    return *myArr;
}

int main() {
    int myArr[] = {10,14,13,19,15,12,16,18,17,11};
    int newArr = bubbleSort(myArr, 8);
    printArray(&newArr, 8);
    return 0;
}

这就是我得到的: 10, 10, 12, 13, 14, 15, 16, 18, 没有19和双10

有没有更简单的方法来获取函数中数组的长度?谢谢...

【问题讨论】:

  • 您可以使用std::arraystd::vector 来跟踪它们的实际长度。
  • 您的数组有 10 个元素但您将长度设置为 8 是故意的吗?

标签: c++ arrays sorting printing


【解决方案1】:

问题是您将指针与具有单个整数的数组混淆了。

int bubbleSort(int *myArr, int lenght) {
    // ... not actually that important what happens here ...
    return *myArr;
}

您的bubbleSort 获得了一个指向传递的数组的第一个元素的指针,您进行了一些排序,最终您返回了该排序数组的第一个元素(返回类型为int!)。这是错误的,或者也许没有错但没有多大意义,但真正的戏剧只会在以后出现……

...在这里的时候

 int newArr = bubbleSort(myArr, 8);
 printArray(&newArr, 8); 

您将从bubbleSort 返回的单个整数复制到newArrint),然后获取它的地址(仍然“ok”),然后在printArray 中表现得好像它指向一个它不指向的数组(现在它去 BOOOOM!)。

printArray 中的 myArr[i]i &gt; 0 时是未定义的行为,因为 myArr 指向单个整数。它不指向数组。

TL;DR:不要使用 c 数组。 c-arrays 是高级 C++,它们很容易出错,很难正确。将std::vector 用于动态大小的数组,将std::array 用于编译时大小的数组。

【讨论】:

  • 谢谢你的解释!!!
【解决方案2】:

这是您的程序的更正版本:

#include <iostream>

void printArray(int* myArr, int size) {
    for (int i = 0; i < size; ++i) {
        std::cout << myArr[i] << ", ";
    }
}

void bubbleSort(int* myArr, int size) {
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size-1; ++j) {
            if (myArr[j] > myArr[j+1]) {
                int temp = myArr[j];
                myArr[j] = myArr[j+1];
                myArr[j+1] = temp;
            }
        }
    }
}

int main() {
    int myArr[] = {10,14,13,19,15,12,16,18,17,11};
    bubbleSort(myArr,10);
    printArray(myArr,10);
    return 0;
}

还可以找到矢量版本:


#include <iostream>
#include <vector>

void printArray(std::vector<int> & vec) {
    for (int i = 0; i < vec.size(); ++i) {
        std::cout << vec[i] << ", ";
    }
}

void bubbleSort(std::vector<int> & vec) {
    for (int i = 0; i < vec.size(); ++i) {
        for (int j = 0; j < vec.size()-1; ++j) {
            if (vec[j] > vec[j+1]) {
                std::swap(vec[j],vec[j+1]);
            }
        }
    }
}

int main() {
    std::vector<int> vec = {10,14,13,19,15,12,16,18,17,11};
    bubbleSort(vec);
    printArray(vec);
    return 0;
}

希望这对某人有用。

【讨论】:

    【解决方案3】:

    这是应该工作的想法:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void printArray(vector<int> arr) {
        for (auto & item : arr) 
        {
            cout << item<<' ';
        }
    }
    
    void bubbleSort(vector<int> &arr) 
    {
        bool swapp = true;
        while (swapp) {
            swapp = false;
            for (size_t i = 0; i < arr.size() - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    arr[i] += arr[i + 1];
                    arr[i + 1] = arr[i] - arr[i + 1];
                    arr[i] -= arr[i + 1];
                    swapp = true;
                }
            }
        }
    }
    void main() {
        vector<int> arr = { 10,14,13,19,15,12,16,18,17,11 };
        bubbleSort(arr);
    
        printArray(arr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多