6

我一遍又一遍地检查代码中的任何问题,但无法弄清楚为什么我的冒泡排序程序没有给出正确的输出。你能帮我鉴定一下吗?

#include <iostream.h>
#include <conio.h>

 using namespace std;

 main()

{
  int number[10];
  int temp=0;
  int i=0;

  cout<<"Please enter any ten numbers to sort one by one: "<<"\n";

  for (i=0;i<10;i++)
  {
      cin>>number[i];
      }
  i=0;

  for (i=0;i<10;i++)
  {

      if(number[i]>number[i+1])

      {
      temp=number[i+1];
      number[i+1]=number[i];
      number[i]=temp;
                          }

      }
      i=0;
      cout<<"The sorted numbers are given below:"<<"\n";

      for (i=0;i<10;i++)
      {
        cout<<number[i]<<"\n";  
          }

          getch();
  }

编辑:我已经接受了你们所说的必须有一个外循环。但我又在想我写的东西。我认为具有气泡条件的唯一循环应该进行排序。这是我的想法:

for (i=0;i<10;i++)
    if(number[i]>number[i+1])
    {
        temp=number[i+1];
        number[i+1]=number[i];
        number[i]=temp;

    }
} 

现在我解释一下我在想这个循环“应该”做什么。它将首先将 number[0] 与 number[1] 进行比较。如果满足条件,它将执行 IF 语句主体中的操作。然后 i 将增加 1(i++)。然后在下一次迭代中,比较的值将是 number[1] 和 number[2]。那为什么它没有发生并且循环仅在通过后退出?换句话说,可能是我想问 IF 语句不会在 for 循环中重复吗?在我看来确实如此。我非常感谢您的帮助和意见,我的问题可能很小,但这就是我的进步。谢谢。

4

6 回答 6

3

这只是冒泡排序的第一步。您需要重复排序部分,直到在通过期间不执行排序。

于 2012-09-03T11:25:34.267 回答
2
  • 您只运行一次气泡循环 - 您应该运行它直到所有内容都排序
  • 你的气泡循环到十,访问number[i+1],这是一个未定义的行为

以下是修复主循环的方法:

bool again;
do {
    again = false;
    for (i=0;i<9;i++)
    { //       ^-- Nine, not ten
        if(number[i]>number[i+1])
        {
            temp=number[i+1];
            number[i+1]=number[i];
            number[i]=temp;
            again = true;
        }
    }
} while (again);
于 2012-09-03T11:25:33.400 回答
1

冒泡排序是 O(n*n)(worst case)---->需要一个从迭代开始到结束的内循环。然后你应该检查是否在中途完成以获得更好的情况,例如 O(nlogn) 或 O(n)。

for (i=0;i<9;i++)     //from 0 up to N-1
{ 
  failed=false;      //for the checking if finished
  for(int j=i+1;j<10) //from next element up to N
   {
     if(number[i]>number[j])
     {
         temp=number[j];
         number[j]=number[i];
         number[i]=temp;
         failed=true;
      }


   }
  if(!failed)break;         //if failed=false then it is done.
}

您的错误仅从 0--->N 迭代一次

  • 外循环应该从 0--->N-1 开始,因为下一个元素最后会是 N。
  • 内循环应该从 i+1 到 N。i+1 表示next元素。

如果需要在 n*n 次迭代之前完成时中断,则需要用布尔值告知

例子:

Initial : 4 9 3 6 2 5 7

1st pass: 4 3 6 2 5 7 9  ---> failed at many i(you see "9" bubbled )

2nd pass: 3 4 2 5 6 7 9 ---> failed at several i's(you see "6" bubbled)

3rd pass: 3 2 4 5 6 7 9 ---> failed(once) at 4 and 2(you see "4" bubbled)

4th pass: 2 3 4 5 6 7 9 ---> failed once at 2 and 3(3 bubbles)

5th pass: 2 3 4 5 6 7 9 --->same! did not fail. Finished without looping 2  more
于 2012-09-03T11:25:47.253 回答
1

拥有它非常危险

int number[5];

并要求用户输入 10 个值;-)

于 2012-09-03T11:26:02.503 回答
1

您将超出数组的范围。让循环运行 5 次,而不是 10 次。

其次,您试图仅通过一次对数组进行排序。制作嵌套循环。进行完整排序。例如,如果你有这个数组。

3  4  1  2  6

一次通过后,就像你正在做的那样,它看起来像这样。

3  1  2  4  6

所以这个数组没有完全排序。做两个循环以完成排序。

并确保运行循环直到size - 1

于 2012-09-03T11:26:03.930 回答
0

这可能是因为您声明了一个大小为 5 的数组,number[5]但尝试输入和访问 10 个元素。

如果要在数组中有 10 个元素,请将其声明为int number[10];

并使用 for 循环:

for (i=0;i<9;i++)     //from 0 up to N-1
{
  for(int j=i+1;j<10) //from next element up to N
   {
  if(number[i]>number[i+1])

     {
  temp=number[i+1];
  number[i+1]=number[i];
  number[i]=temp;
      }

   }
}
于 2012-09-03T11:27:35.517 回答