鱼C论坛

 找回密码
 立即注册
查看: 1594|回复: 1

[已解决]冒牌排序求助

[复制链接]
发表于 2023-10-26 23:54:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#define NUMBER 5
int main(void)
{
        int i;
        int v[NUMBER];
       
        printf("请输入%d人的身高。\n",NUMBER);
        for (i = 0;i < NUMBER;i++){
                printf("%d号:",i+1);
                scanf("%d",&v[i]);
        }
       
        puts("按升序排列。");
        for (i = NUMBER;i > 0;i--){
                if (v[i] < v[i-1]){
                        int swap;
                        swap = v[i-1];
                        v[i-1] = v[i];
                        v[i] = swap;
                }
        }
       
        for (i = 0;i < NUMBER - 1;i++)
                printf("%d号:%d\n",i+1,v[i]);
       
       
        return 0;
}
请问这个冒泡排序错在哪里了呀?
最佳答案
2023-10-26 23:55:14
这段代码中的排序算法并不是冒泡排序,而是一种错误的排序算法。冒泡排序的核心思想是通过相邻元素的比较和交换来实现排序。以下是对这段代码进行修正的冒泡排序算法:

  1. #include <stdio.h>
  2. #define NUMBER 5

  3. int main(void)
  4. {
  5.     int i;
  6.     int v[NUMBER];

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

  12.     puts("按升序排列。");
  13.     for (i = 0; i < NUMBER - 1; i++) {
  14.         for (int j = 0; j < NUMBER - i - 1; j++) {
  15.             if (v[j] > v[j + 1]) {
  16.                 int swap = v[j];
  17.                 v[j] = v[j + 1];
  18.                 v[j + 1] = swap;
  19.             }
  20.         }
  21.     }

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

  24.     return 0;
  25. }
复制代码


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

请注意,修正后的代码中的内层循环条件是  j < NUMBER - i - 1 ,这是因为每一轮外层循环都会将当前最大的元素移动到数组的末尾,所以下一轮内层循环时可以不再考虑已经排序好的部分。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-26 23:55:14 | 显示全部楼层    本楼为最佳答案   
这段代码中的排序算法并不是冒泡排序,而是一种错误的排序算法。冒泡排序的核心思想是通过相邻元素的比较和交换来实现排序。以下是对这段代码进行修正的冒泡排序算法:

  1. #include <stdio.h>
  2. #define NUMBER 5

  3. int main(void)
  4. {
  5.     int i;
  6.     int v[NUMBER];

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

  12.     puts("按升序排列。");
  13.     for (i = 0; i < NUMBER - 1; i++) {
  14.         for (int j = 0; j < NUMBER - i - 1; j++) {
  15.             if (v[j] > v[j + 1]) {
  16.                 int swap = v[j];
  17.                 v[j] = v[j + 1];
  18.                 v[j + 1] = swap;
  19.             }
  20.         }
  21.     }

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

  24.     return 0;
  25. }
复制代码


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

请注意,修正后的代码中的内层循环条件是  j < NUMBER - i - 1 ,这是因为每一轮外层循环都会将当前最大的元素移动到数组的末尾,所以下一轮内层循环时可以不再考虑已经排序好的部分。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 00:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表