C中的自定义冒泡排序
Custom Bubble Sort in C
我想了解我的代码有什么问题,我是 C 的初学者,但是,我在 java 中进行了大量编程。我使用 8 个整数为冒泡排序制作了自己的 "lazy" 实现,但它会导致无限循环。
一些解释:尝试将 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]);
}
您需要更改以下代码:
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; ...}
所以它类似修改冒泡排序。
如果块
切换这个不正确
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]);
我想了解我的代码有什么问题,我是 C 的初学者,但是,我在 java 中进行了大量编程。我使用 8 个整数为冒泡排序制作了自己的 "lazy" 实现,但它会导致无限循环。
一些解释:尝试将 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]);
}
您需要更改以下代码:
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; ...}
所以它类似修改冒泡排序。
如果块
切换这个不正确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]);