BubbleSorting C语言
我们正在学习数组,我只是围绕着泡泡排序。
我编写了以下代码来按升序对数组进行排序,但是存在问题。
我找不到它,但我知道有问题。
我找到了正确的代码,但我仍然不明白为什么这不起作用。
我的代码
int a; int i; int temp; int value[5] = { 5, 4, 3, 2, 1 }; for (i = 0; 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]); }
您的代码有多个问题,
-
首先,您正在使用
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])
-
最大的问题是,你还没有完全理解Bubblesort。 在冒泡排序中循环运行多次,直到循环中没有要交换的成员,即停止循环时。
这就是维基百科所说的
冒泡排序 ,有时也称为下沉排序 ,是一种简单的排序算法,它反复遍历要排序的列表,比较每对相邻的项目,如果它们的顺序错误则交换它们。 重复遍历列表,直到不需要交换,这表示列表已排序。 该算法是一种比较排序,以较小或较大元素“冒泡”到列表顶部的方式命名。 尽管该算法很简单,但即使与插入排序相比,它对于大多数问题来说太慢且不切实际。如果输入通常按排序顺序但偶尔可能有一些无序元素几乎就位,则它可以是实用的。
请参阅下面的演示文稿以了解冒泡排序的工作原理。一次又一次地查看循环运行,直到没有成员可以交换。
分步示例
让我们取数字数组“5 1 4 2 8”,并使用冒泡排序将数组从最小数字排序到最大数字。 在每个步骤中,正在比较以粗体书写的元素。 将需要三次通行证。
第一关
( 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
,并且再次执行循环因为count为1
,如果在最后一次传递中,它的值不会变为1
因为所有成员现在都已排序,因此循环不会再次运行。
当i == 4
您使用value[i+1]
访问位置5并且它不是您的。
您正在访问未预留的内存。