【问题标题】:Modified bubble sort passes error修改冒泡排序通过错误
【发布时间】:2015-05-28 22:35:15
【问题描述】:

编写一个 C 程序,对包含 n 个元素的数组执行冒泡排序。

注意:如果您发现列表在任何中间点排序,请停止该过程

它对其他数字正常工作,但是当我输入 3、2、4、5、6 时,它没有正确显示通行证。它没有正确显示通行证,而是对每个通行证重复相同的值。

输入元素数量:

5

输入元素 1

3

输入元素2

2

输入元素 3

4

输入元素 4

5

输入元素 5

6

未排序的列表是:

3 2 4 5 6

在 Pass 1 之后的元素是:2 3 4 5 6

在 Pass 2 之后的元素是:2 3 4 5 6

在 Pass 3 之后的元素是:2 3 4 5 6

在 Pass 4 之后的元素是:2 3 4 5 6

排序后的列表是:

2 3 4 5 6

请帮我解决问题。

这是我的代码:

#include<stdio.h>
int main(){

int s,i,j,temp,a[20],count=0,x,n=0;
printf("Enter the number of elements :\n");
scanf("%d",&s);
for(i=0;i<s;i++)
{
    printf("Enter element %d\n",i+1);
    scanf("%d",&a[i]);
}
printf("Unsorted list is :\n");
for(i=0;i<s;i++)
{
    printf("%d ",a[i]);
}
for(i=0;i<(s-1);i++)
{
    n++;
    for(j=0;j<(s-i)-1;j++)
    {
        if(a[j]>a[j+1])
        {
            temp=a[j];
            a[j]=a[j+1];
            a[j+1]=temp;
            count++;
         }
    }
    if(count<0)
    {
        break;
    }
    else
    {
        printf("\nAfter Pass %d elements are :",n);
        for(x=0;x<s;x++)
        {
            printf("%d ",a[x]);
        }
     }
   }
   printf("\nSorted list is :\n");
   for(i=0;i<s;i++)
       printf("%d ",a[i]);
  return 0;
}

【问题讨论】:

  • 问题是第一遍排序它,然后它继续,好像它没有注意到一样。你写了一个 is_sorted() 来检查这个吗?
  • 但最后我们可以得到排序列表,因为如果程序可以正确运行,那么它必须显示 2 遍,但它没有显示。
  • 两个问题:(1)检查count是否
  • 其实count == 0,不能少。 (嗯,不应该)
  • for(j=0; 更改为 for(j=count=0;if(count&lt;0) 更改为 if(count==0)

标签: c


【解决方案1】:

您需要在循环开始时将计数重置为 0。当你交换元素时,它会增加,但你永远不会绊倒if (count &lt;= 0),除非你只计算这次传递中的交换。

【讨论】:

  • 根据您的逻辑,我更改了代码,但是对于像 1,2,3,4,5 这样的值,它至少应该通过一次,但它直接给出排序后的数据,帮帮我,什么我应该改变??????
  • 它在“第一次运行”之前退出。尝试将 if count
  • 当然可以,很高兴为您提供帮助! :)
【解决方案2】:
#include<stdio.h>
int main() 
{
  int array[100],i,n,c,swap,flag=0;
  printf("Enter the number of elements :\n");
  scanf("%d",&n);
  for(c=0;c<n;c++)
  {
  printf("Enter element %d\n",c+1);
  scanf("%d",&array[c]);
  }
  printf("Unsorted list is :\n");
  for(i=0;i<n;i++)
    printf("%d ",array[i]);
  printf("\n");
  for(c=0;c<n-1;c++)
  {
    if(flag==0)
    {
      flag=1;
     for(i=0;i<n-1;i++)
     { 
        if(array[i]>array[i+1])
        {
          swap=array[i];
          array[i]=array[i+1];
          array[i+1]=swap;
          flag=0;
        }
    }
    printf("After Pass %d elements are :",c+1);
    for(i=0;i<n;i++)
    {
      printf("%d ",array[i]);
    }                   
    printf("\n");
    }
  }
  printf("Sorted list is :\n");
  for(c=0;c<n;c++)
    printf("%d ",array[c]);
  return 0;
}

-我也被困在这个过程中。以上解决方案由@subin sv 从此链接提供here。功劳归于他。主要逻辑是通过flag判断是否排序。

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2021-03-23
    相关资源
    最近更新 更多