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]); } 

您的代码有多个问题,

  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 } 
  2. 您正在访问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]) 
  3. 最大的问题是,你还没有完全理解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并且它不是您的。

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