我们正在学习数组,而我只是讨论了气泡排序。
我编写了下面的代码来按升序对数组进行排序,但是有一个问题。
我找不到但我知道有问题。
我已经找到了正确的代码,但我仍然不明白为什么这不起作用。
我的代码
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]);
}发布于 2017-02-05 05:09:12
你的代码有多个问题
value[i]进行排序之后打印数组元素,并且运行带有变量a.for(a=0;a<5;a++){ //的循环,您正在递增一个printf(“%d ",valuei);//但是在这里使用i,将其更改为.//,因为它将只打印valuei成员}value[5],而这不是您的。
对于(i=0;i<5;i++){ //在最后一个循环中的value4与value5进行比较,// value5没有定义//for(i=0;i<4;i++) //相反,运行循环直到i<4,我想这是您/想要的,但意外地犯了错误。if(valuei>valuei+1)这就是维基百科他说
Bubble sort有时被称为sinking ,它是一种简单的排序算法,它反复遍历要排序的列表,比较每一对相邻的项目,如果它们的顺序不对,就交换它们。遍历列表将被重复,直到不需要交换,这表明列表已被排序。该算法是一种比较排序,它的命名方式是将较小或较大的元素“冒泡”放到列表的顶端。虽然该算法简单,但对于大多数问题来说,它过于缓慢和不切实际,即使与插入sort.It相比,如果输入通常是排序的,但偶尔也会有一些零序元素处于接近位置时,它也是实用的。
请参阅下面的演示文稿,以了解Bubble排序Works.See循环是如何一次又一次地运行的,直到没有成员可以交换为止。

逐步示例 让我们把数字的数组"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,如果在循环中执行交换语句,则它会更改为1,并且循环再次被执行,因为count是1,如果在最后一次传递中,它的值不会更改为1,因为现在所有成员都已排序,所以循环不再运行。
发布于 2017-02-04 17:48:33
当i == 4使用value[i+1]访问5时,它就不是您的了。
您正在访问无保留内存。
https://stackoverflow.com/questions/42043489
复制相似问题