C中的自定义冒泡排序

时间:2015-01-24 17:32:23

标签: c sorting

我试图了解我的代码有什么问题,我是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]);

}

2 个答案:

答案 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]);