冒泡排序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语言的主要内容,如果未能解决你的问题,请参考以下文章