【问题标题】:Bubble sort ignoring the first element of the array冒泡排序忽略数组的第一个元素
【发布时间】:2017-12-25 20:23:52
【问题描述】:

我正在做作业,但不知道为什么冒泡排序不起作用。由于某些未知原因,它正在使数组的第一个元素为零。

#include <iostream>

using namespace std;

int main()
{
    int *arr,s;
    cout<<"Enter the quantity of numbers ";
    cin>>s;
    arr=new int[s];
    for(int i=0;i<s;i++)
    {
        cout<<"Enter number "<<i+1<<" ";
        cin>>*(arr+i);
    }
    int temp;
    for(int j=0;j<s;j++)
    {
        for(int k=0;k<(s-j);k++)
        {
            if(*(arr+k)>*(arr+k+1))
            {
                temp=*(arr+k);
                *(arr+k)=*(arr+k+1);
                *(arr+k+1)=temp;
            }
        }
    }
    for(int x=0;x<s;x++)
    {
        cout<<*(arr+x)<<"\t";
    }
    cout<<endl;
    return 0;
}

输出

Enter the quantity of numbers 5
Enter number 1 4
Enter number 2 33
Enter number 3 22
Enter number 4 1
Enter number 5 3
0       1       3       4       22

我不知道为什么第一个元素变为零。如果我在没有冒泡排序循环的情况下运行它,它会完美运行,但不要使用这些循环。

【问题讨论】:

  • 请注意,缺少的元素不是最小的(1),而是最大的(33)。这意味着已排序数组中的每个元素都向右移动了一个。这应该可以帮助您调试。
  • 最后一个元素也被忽略了
  • @Junaid Khalid 这里 if(*(arr+k)>*(arr+k+1)) 当 j 等于 0 并且 k 等于s - 1.
  • 由于一些未知原因 -- 原因已知的。那么你想知道如何找出原因吗?您发现的方法是使用编译器工具集附带的调试器并单步执行您的代码,仔细查看数组、索引以及正在访问的索引。
  • k 被初始化为零并且没有递减,那么 k 如何等于 -1?

标签: c++ arrays sorting for-loop bubble-sort


【解决方案1】:

在这个for循环中

    for(int k=0;k<(s-j);k++)
    {
        if(*(arr+k)>*(arr+k+1))
                      ^^^^^^^ 
        {
            temp=*(arr+k);
            *(arr+k)=*(arr+k+1);
            *(arr+k+1)=temp;
        }

j 等于0 并且k 等于s - 1 时,将尝试访问数组之外​​的内存。也就是说,在这种情况下,k + 1 等于 s,尽管索引的有效范围是 [0, s-1]

至少按以下方式更改循环

for(int j=0;j<s;j++)
{
    for(int k = 1;k<(s-j);k++)
    {
        if(*(arr+k) < *(arr+k-1))
        {
            int temp=*(arr+k);
            *(arr+k)=*(arr+k-1);
            *(arr+k-1)=temp;
        }
    }
}

【讨论】:

    【解决方案2】:

    您对索引的使用已关闭。您正在从您的有效范围之外拾取垃圾值(它们恰好是零)。更简单的样式可能有助于发现问题。

    for(int j=0;j<s;j++)
    {
        for(int k=1;k<s;k++)
        {
            if(arr[k-1]>arr[k])
            {
                int temp=arr[k];
                arr[k]=arr[k-1];
                arr[k-1]=temp;
            }
    

    【讨论】:

      【解决方案3】:

      代码

      #include <bits/stdc++.h>
      using namespace std;
      int N, a[10050];
      int main() {
          scanf("%d", &N);
          for (int i = 0; i < N; i++) scanf("%d" , &a[i]);
          for (int k = 0; k < N; k++) {
              int mn = k;
              for (int i = k+1; i < N; ++i) {
                  if (a[i] < a[mn]) mn = i;
              }
              swap(a[k], a[mn]);
          }
          for (int i = 0; i < N; i++) printf("%d " , a[i]);
      }
      

      说明

      在冒泡排序中,您递归地交换元素。这是一个 15 行代码。希望对您有所帮助。

      【讨论】:

      • 避免在示例中使用内部标题。应该添加 #include // 用于 scanf, printf #include // 在 C++98 中交换位置 #include // 在 C++11(及更高版本)中交换位置
      • 但 #include 包含所有这些常见的标头
      • 是的,但它依赖于编译器。不在标准内。我同意它让事情变得“简单”,但不是真正的便携。
      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多