冒泡排序C语言

Posted

技术标签:

【中文标题】冒泡排序C语言【英文标题】:BubbleSorting C language 【发布时间】:2017-06-21 23:03:22 【问题描述】:

我们正在学习数组,而我刚刚接触了冒泡排序。 我编写了以下代码以升序对数组进行排序,但是出现了问题。 我找不到它,但我知道有问题。 我找到了正确的代码,但我仍然不明白为什么这不起作用。

我的代码

int a;
int i;

int temp;
int value[5] =  5, 4, 3, 2, 1 ;

for (i = 0; i < 5; i++) 
    if (value[i] > value[i + 1]) 
        temp = value[i];
        value[i] = value[i + 1];
        value[i + 1] = temp;
    


for (a = 0; a < 5; a++) 
    printf(" %d ", value[i]);

【问题讨论】:

提示:您需要在当前循环中使用内部 for 循环才能正确实现冒泡排序。 注意不要与超出范围的项目进行比较。 (现在在您的代码中发生这种情况。) 此外,在最后一个循环中,您应该使用 value[ a ]。 我需要什么内部 for 循环? 见下面的答案,基本上你必须多次运行循环,你也打印错了,使用 a 循环,但打印值[i] ,而不是使用 value[a] 【参考方案1】:

您的代码有多个问题,

    首先,您正在打印使用value[i] 进行的排序之后的数组元素,并且您正在使用变量a 运行循环。

    for(a=0;a<5;a++)               //You Are Incrementing a
    
    printf(" %d ",value[i]);        //But Using i here , change it to a.
                                    //As It will just print the value[i] member
    
     
    

    您正在访问 value[5] ,这不是您的。

     for(i=0;i<5;i++) //Here In The Last Loop value[4] is  compared with value[5],
                       // value[5] is not defined 
    
    //for(i=0;i<4;i++)       
    //Instead Run Loop Till i<4 , I guess this is what you 
    //wanted but accidently made a mistake.
    
       if(value[i]>value[i+1])
    

    最大的问题是你还没有完全理解冒泡排序。 在冒泡排序中,循环运行多次,直到在循环中没有要交换的成员,即当您停止循环时。

这就是***Says

冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它反复遍历待排序的列表,比较每对相邻项并交换如果它们的顺序错误。重复通过列表,直到不需要交换,这表明列表已排序。该算法是一种比较排序,以较小或较大元素“冒泡”到列表顶部的方式命名。尽管该算法很简单,但即使与插入排序相比,它对于大多数问题也太慢且不切实际。如果输入通常按排序顺序排列,但偶尔可能会有一些几乎就位的乱序元素,则它可能是实用的。

请参阅下面的演示文稿以了解冒泡排序的工作原理。一次又一次地查看循环运行,直到没有成员可以交换。

分步示例

让我们取数字数组“5 1 4 2 8”,并使用冒泡排序从最小数字到最大数字对数组进行排序。在每个步骤中,都会比较用 bold 编写的元素。需要三张通行证。

第一关

( 5 1 4 2 8 ) 到 (1 5 4 2 8 ),这里算法比较前2个元素,并从5> 1开始交换。 ( 1 5 4 2 8 ) 到 ( 1 4 5 2 8 ),从 5 > 4 开始交换 ( 1 4 5 2 8 ) 到 ( 1 4 2 5 8 ),从 5 > 2 开始交换 ( 1 4 2 5 8 ) 到 ( 1 4 2 5 8 ),现在,由于这些元素已经有序 (8 > 5),算法不会交换它们.

第二关

( 1 4 2 5 8 ) 到 ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) 到 ( 1 2 4 5 8 ),从 4 > 2 开始交换 ( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 )

现在,数组已经排好序了,但算法不知道是否完成。该算法需要一整遍而不进行任何交换才能知道它已排序。

第三关

( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) 到 ( 1 2 4 5 8 )

所以你需要多次运行循环直到没有成员可以交换,你可以通过有一个新变量 count 来做到这一点,在开始时最初初始化为 1,并且在每个循环开始之前,它初始化为0,如果在循环中,则执行Swap语句,它变为1,并再次执行循环,因为计数为1,如果在最后一遍,其值不会变为@ 987654334@ 因为现在所有成员都已排序,所以循环不会再次运行。

【讨论】:

@WaqasShahbaz 如果对您有帮助,您可以投票。 @WaqasShahbaz 黄色的一切都来自***。【参考方案2】:

i == 4 使用value[i+1] 访问位置5 时,它不是你的。

您正在访问未保留的内存。

【讨论】:

以上是关于冒泡排序C语言的主要内容,如果未能解决你的问题,请参考以下文章

C语言冒泡排序法代码

c语言冒泡排序最终结果错误

冒泡排序和选择排序(C语言)

c语言冒泡排序法代码一直排序错误,有时只能排前两个,不明白原因,请问究竟哪里写错了,谢谢!

[c语言]总结冒泡排序的一些细节

冒泡排序法