c++ 运行冒泡排序时出现分段错误

abithluo  于 2023-05-24  发布在  其他
关注(0)|答案(4)|浏览(129)

我试图运行一个冒泡排序算法,该算法按升序对数组进行排序,但它在在线编译器中出现了分段错误,我无法找出其中的错误,因为我认为数组中的元素应该具有4的大小,但在我尝试之后,我无法找到解决方案。谁能帮我看看?

#include <iostream>
#include <array>
using namespace std;

void bubble_sort(int arr[]);
void printArray(int arr[]);

int main()
{

    int arr[] = {10, 4, 2, 8, 11, 15};

    bubble_sort(arr);
    printArray(arr);
    // cout<<sizeof(arr)<<endl;

    return 0;
}

void bubble_sort(int arr[])
{
    for (int i = 0; i < sizeof(arr) / 4; i++)
    {
        for (int j = 0; i < ((sizeof(arr) / 4) - 1); j++)
        {
            int temp;
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

void printArray(int arr[])
{
    for (int i = 0; i < (sizeof(arr) / 4); i++)
    {
        cout << arr[i] << endl;
    }
    cout << "\n";
}
nkcskrwz

nkcskrwz1#

bubble_sort中嵌套的for循环有一个终止条件i < ((sizeof(arr) / 4) - 1)。因为变量i在嵌套循环中从不递增,所以它将永远循环。试试j < ((sizeof(arr) / 4) - 1)。这就是导致分段错误的原因。
我还建议将数组的大小作为单独的参数传递给函数,而不是试图在函数中使用sizeof。正如'Some programmer dude'所提到的,sizeof函数当前使用的是*int的大小,而不是数组中元素的数量。main函数中的sizeof(arr)可以解决这个问题。
(This这是我在Stack Overflow上的第一个答案,所以请原谅我的任何格式错误。

bybem2ql

bybem2ql2#

现代C++冒泡排序方式:

#include <iostream>
#include <algorithm>
#include <iterator>
#include <ranges>

template <std::ranges::bidirectional_range R>
void bubble_sort(R&& r) {
  while (true) {
      auto it = std::ranges::is_sorted_until(r);
      if (it == std::end(r)) {
          break;
      }
      std::iter_swap(it, std::prev(it));
  }
}

template <std::ranges::forward_range R>
void print(R&& r) {
    for (auto it = std::begin(r); it != std::end(r); ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n';
}

int main() {
    int arr[] = {10, 4, 2, 8, 11, 15};

    bubble_sort(arr);
    print(arr);
}

演示:https://wandbox.org/permlink/Co4k1GA8ozQ9PfDv
请注意:

  • 这里不需要知道数组的大小
  • 该算法并不局限于C风格的数组,你可以使用(双向)链表、向量、跨度、二叉树等
  • 代码要“描述性”得多;你会发现“where is sorted until”,ans“如果该点是范围的末尾,则停止”,如果不是,则“与该点之前的内容交换”
5jdjgkvh

5jdjgkvh3#

你的代码中有几个错误。
1.在main()函数中声明int arr[],可以得到正确的数组大小,如下所示:
int array_size = sizeof(arr)/ sizeof(arr[0]);**
1.然而,在main()函数之外,以及在2个函数bubble_sort(arr[])printArray(int arr[])内部,您将使用以下代码获得错误的数组大小:
int array_size = sizeof(arr)/ sizeof(arr[0]);

因为这两个函数只将输入参数
int arr[]视为指向int的指针。
1.但是,代码崩溃的主要原因如下。在bubble_sort()函数中,你的第二个
for循环是不正确的,应该写如下:
int j = 0; j <(size - i - 1); j++)

所以,我对你的原始代码做了一些小的修改,它的工作原理如下所示:

#include <iostream>
#include <array>
using namespace std;

void bubble_sort(int arr[], int size);
void printArray(int arr[], int size);

int main()
{

    int arr[] = {10, 4, 2, 8, 11, 15};

    int array_size = sizeof(arr) / sizeof(arr[0]);

    bubble_sort(arr, array_size);
    printArray(arr, array_size);
    // cout<<sizeof(arr)<<endl;

    return 0;
}

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

void printArray(int arr[], int size)
{
    for (int i = 0; i < size ; i++)
    {
        cout << arr[i] << endl;
    }
    cout << "\n";
}

==================
注:我的回答与其他人之前的评论非常相似(例如用户“卡登Kroonenberg”和“一些程序员老兄”)。我只想写完整的正确代码,以提高可读性,并为我自己的参考:-)。

bvjxkvbb

bvjxkvbb4#

在C++中有更好的方法来处理数组,例如。

#include <algorithm>
#include <iostream>

//---------------------------------------------------------------------------------------------------------------------
// 
// using namespace std; <== unlearn to do this. 
//

//---------------------------------------------------------------------------------------------------------------------
// Instead of having to do sizeof(arr)/sizeof(arr[0]) and trying to deal with pointer decay/losing size informatino of the array : 
// Use this syntax int (&arr)[N] to pass an array by reference AND its size N
// (or use std::array<int,N>&)
// I made this a function template so the function will compile for any N
// I also replaced int by std::size_t since that's the common indexing type 
// in collections (and unlike int it cant get to negative indices)

template<std::size_t N>
void bubble_sort(int(&arr)[N])
{
    for (std::size_t i = 0; i < N; i++) // no need to divide by sizeof(int)
    {
        for (std::size_t j = 0; j < N - 1; j++) // <== you had an i here in the comparison in your original code, also a bug
        {
            if (arr[j] > arr[j + 1])
            {
                std::swap(arr[j], arr[j + 1]); // using swap make code explain itself
            }
        }
    }
}

//---------------------------------------------------------------------------------------------------------------------

template<std::size_t N>
void printArray(const int(&arr)[N])     // pass by const content off arr must not be modifiable by print
{
    bool comma = false;
    std::cout << "[";

    // use range based for loop, can't go out of bound.
    for (const auto value : arr)
    {
        if (comma) std::cout << ",";
        std::cout << value;
        comma = true;
    }

    std::cout << "]\n"; // preferably don't use std::endl (it will flush and slow output down)
}

//---------------------------------------------------------------------------------------------------------------------

int main()
{
    int arr[]{ 10, 4, 2, 8, 11, 15 };

    bubble_sort(arr);
    printArray(arr);

    return 0;
}

相关问题