1215787625 发表于 2023-10-26 23:54:35

冒牌排序求助

#include <stdio.h>
#define NUMBER 5
int main(void)
{
        int i;
        int v;
       
        printf("请输入%d人的身高。\n",NUMBER);
        for (i = 0;i < NUMBER;i++){
                printf("%d号:",i+1);
                scanf("%d",&v);
        }
       
        puts("按升序排列。");
        for (i = NUMBER;i > 0;i--){
                if (v < v){
                        int swap;
                        swap = v;
                        v = v;
                        v = swap;
                }
        }
       
        for (i = 0;i < NUMBER - 1;i++)
                printf("%d号:%d\n",i+1,v);
       
       
        return 0;
}
请问这个冒泡排序错在哪里了呀?

isdkz 发表于 2023-10-26 23:55:14

这段代码中的排序算法并不是冒泡排序,而是一种错误的排序算法。冒泡排序的核心思想是通过相邻元素的比较和交换来实现排序。以下是对这段代码进行修正的冒泡排序算法:

#include <stdio.h>
#define NUMBER 5

int main(void)
{
    int i;
    int v;

    printf("请输入%d人的身高。\n", NUMBER);
    for (i = 0; i < NUMBER; i++) {
      printf("%d号:", i + 1);
      scanf("%d", &v[ i]);
    }

    puts("按升序排列。");
    for (i = 0; i < NUMBER - 1; i++) {
      for (int j = 0; j < NUMBER - i - 1; j++) {
            if (v > v) {
                int swap = v;
                v = v;
                v = swap;
            }
      }
    }

    for (i = 0; i < NUMBER; i++)
      printf("%d号:%d\n", i + 1, v[ i]);

    return 0;
}


修正后的代码使用了嵌套循环,在每一轮外层循环中,内层循环通过比较相邻元素的大小来进行交换,将较大的元素逐渐移动到数组的末尾。这样,经过多轮的比较和交换,最终实现了升序排序。

请注意,修正后的代码中的内层循环条件是j < NUMBER - i - 1 ,这是因为每一轮外层循环都会将当前最大的元素移动到数组的末尾,所以下一轮内层循环时可以不再考虑已经排序好的部分。
页: [1]
查看完整版本: 冒牌排序求助