我试图了解我的代码有什么问题,我是C的初学者,但我在java中进行了大量编程。我做了自己的"懒惰"使用8个整数进行冒泡排序的实现,但是它导致无限循环。
一些解释:尝试将8个整数从大到小排序并使用计数器确定何时对所有值进行排序
#include <stdio.h>
int main()
{
int array[8];
int counter =0;
int storage=0;
int i;
printf("Please enter 8 numbers:");
scanf("%d%d%d%d%d%d%d%d",&array[0],&array[1],&array[2],&array[3],&array[4],&array[5],&array[6],&array[7]);
while (counter!=7)
{
counter =0;
for (i=0; i<=6;i++)
{
if (array[i]<=array[i++])
{
storage = array[i];
array[i]= array[i++];
array[i++]= storage;
}
else
{
counter++;
}
}
}
printf("%d%d%d%d%d%d%d%d",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);
}
答案 0 :(得分:3)
您需要更改以下代码:
if (array[i]<=array[i++])
{
storage = array[i];
array[i]= array[i++];
array[i++]= storage;
}
要
if (array[i]<array[i+1])//++ is post increment operator and you are changing index value with every comparison and assignment
{
storage = array[i];
array[i]= array[i+1];
array[i+1]= storage;
}
无限循环的另一个原因是当你交换两个元素时,你不增加计数器的值。因此,无论是否交换两个元素,都应将其从else部分中删除,并使其在for循环中使用。或者你可以while (counter != 0) {counter = 0; ...}
所以它就像修改冒泡排序一样。
答案 1 :(得分:0)
如果阻止
,则切换不正确if (array[i]<=array[i++])
{
storage = array[i];
array[i]= array[i++];
array[i++]= storage;
}
如果您想要升序 ,请使用此块
if (array[i]>array[i+1])
{
storage = array[i];
array[i]= array[i+1];
array[i+1]= storage;
}
如果你想要一个降序(请注意if条件)或下面这个
if (array[i]<array[i+1])
{
storage = array[i];
array[i]= array[i+1];
array[i+1]= storage;
}
并更改最后一个printf()
,以便通过在整数之间添加空格来获得正确且可读的输出
printf("%d %d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]);