冒泡排序C语言

冒泡排序C语言,c,arrays,sorting,bubble-sort,C,Arrays,Sorting,Bubble Sort,我们正在学习数组,我刚开始学习气泡排序。 我编写了以下代码来按升序对数组进行排序,但存在一个问题。 我找不到,但我知道有个问题。 我已经找到了正确的代码,但我仍然不明白为什么这不起作用 我的代码 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];

我们正在学习数组,我刚开始学习气泡排序。
我编写了以下代码来按升序对数组进行排序,但存在一个问题。
我找不到,但我知道有个问题。
我已经找到了正确的代码,但我仍然不明白为什么这不起作用

我的代码

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]);
}
inta;
int i;
内部温度;
int值[5]={5,4,3,2,1};
对于(i=0;i<5;i++){
如果(值[i]>值[i+1]){
温度=值[i];
值[i]=值[i+1];
值[i+1]=温度;
}
}
对于(a=0;a<5;a++){
printf(“%d”,值[i]);
}

i==4
您使用
值[i+1]
访问位置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])

您正在访问未保留的内存

i==4
时,您使用
值[i+1]
访问位置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])

您正在访问未保留的内存

您的代码有多个问题

  • 首先也是最重要的一点是,在使用
    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
    
    } 
    
  • 最大的问题是你还没有完全理解Bubblesort。 在冒泡排序中,循环运行多次,直到循环中没有可交换的成员,即停止循环

  • 这就是维基百科

    冒泡排序,有时被称为下沉排序,是一种简单的排序算法,它重复遍历要排序的列表,比较每对相邻项,并在它们的顺序错误时交换它们。重复传递列表,直到不需要交换,这表示列表已排序。该算法是一种比较排序,以较小或较大的元素“冒泡”到列表顶部的方式命名。虽然该算法很简单,但对于大多数问题来说,即使与插入排序相比,它也太慢和不切实际。如果输入通常是按排序的顺序进行的,但有时可能会有一些无序元素几乎处于位置,则该算法是可行的

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

    逐步示例

    让我们取数字数组“514428”,并使用气泡排序法将数组从最小数排序到最大数。在每个步骤中,将比较以粗体写的元素。需要三张通行证

    第一关

    5142 8)到(1542 8),这里算法比较前2个元素,并从5>1开始交换。
    (15428)到(14528),从5>4开始交换
    (14528)到(14258),从5>2开始交换
    (1 4 25 8)到(1 4 25 8),现在,由于这些元素已按顺序排列(8>5),算法不会交换它们

    第二遍

    14258)到(14258)
    (14258)到(12458),从4>2开始交换
    (12458)到(12458)
    (1 2 45 8)至(1 2 45 8

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

    第三遍

    12458)到(12458)
    (12458)到(12458)
    (12458)到(12458)
    (1 2 45 8)至(1 2 45 8


    因此,您需要多次运行循环,直到没有成员可交换为止,您可以通过使用一个新变量
    count
    ,在开始时初始化为
    1
    ,在每个循环开始之前,将其初始化为
    0
    ,如果在循环中执行Swap语句,则它将更改为
    1
    ,再次执行循环,因为计数是
    1
    ,如果在最后一次传递中,其值没有更改为
    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
    
    } 
    
  • 最大的问题是你还没有完全理解Bubblesort。 在冒泡排序中,循环运行多次,直到循环中没有可交换的成员,即停止循环

  • 这就是维基百科

    冒泡排序,有时被称为下沉排序,是一种简单的排序算法,它重复遍历要排序的列表,比较每对相邻项,并在它们的顺序错误时交换它们。重复传递列表,直到不需要交换,这表示列表已排序。该算法是一种比较排序,以较小或较大的元素“冒泡”到列表顶部的方式命名。虽然该算法很简单,但对于大多数问题来说,即使与插入排序相比,它也太慢和不切实际。如果输入通常是按排序的顺序进行的,但有时可能会有一些无序元素几乎处于位置,则该算法是可行的

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

    逐步exa