【问题标题】:Bubble Sorting In C : garbage value errorC中的冒泡排序:垃圾值错误
【发布时间】:2020-05-14 03:20:06
【问题描述】:

所以最近我一直在学习 C 中的数据结构。现在让我们来解决我的问题

这是我的冒泡排序算法代码

#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void swap(int *p, int *q) {
  int temp = *p;
  *p = *q;
  *q = temp;
}

int main() {
  int arr[] = {2, 4, 1, 3, 5, 2, 3, 6, 4};  // see below for arr
  int len = sizeof(arr) / sizeof(int);
  for (int i = len - 1; i >= 0; i--) {
    for (int j = 0; j <= i; j++) {
      if (arr[j] < arr[j + 1]) {
        swap(&arr[j], &arr[j + 1]);
      }
    }
  }
  for (int m = 0; m < len; m++) {
    printf("%d\t", arr[m]);
  }
  return 0;
}

当我的数组类似于:int arr[]={2,4,1,3,5,2,6,10}; 时,它的排序很完美,但是当我将 arr 中的值数量增加一时,它开始提供垃圾值。

例如:int arr[]={2,4,1,3,5,2,6,10,13}; 输出:int arr[]={2,4,1,3,5,2,6,10};

详细解答高度赞赏

【问题讨论】:

  • 将 int arr[]={2,4,1,3,5,2,6,10,13} 设置为全局对我有用
  • 您需要访问Bubble Sort - Wikipedia 并查看算法(尤其是优化冒泡排序部分)。您的算法不是冒泡排序,而是其中一种变体。
  • 还要问问自己,“为什么我要包含conio.h, math.hstdlib.h?” “我在使用什么需要这些标头?”
  • 我知道,那是我上次的代码;P

标签: c algorithm data-structures computer-science bubble-sort


【解决方案1】:

j=ii=len-1(在j 上的循环中允许)检查时:

        if(arr[j]<arr[j+1]){
            swap(&arr[j],&arr[j+1]);
        }

超出arr 的范围。此外,即使对于较小的 i 值,也不需要最后一次检查。要修复您的代码,请使用循环条件 j &lt; i 而不是 j &lt;= i

【讨论】:

  • 是的,但你可以通过一个例子来解释它,我没有弄错。请再说一遍。
  • 好的——首先你需要理解——代码对一种输入大小有效并且不适用于另一种输入是不正确的。两个代码同样错误,只是一个(偶然)给出与您的预期输出相匹配的输出。尝试使用您的示例数组{2, 4, 1, 3, 5, 2, 3, 6, 4} 并考虑当我是8(即len-1)和j=i 时的检查是什么。如果将是if (arr[8] &lt; arr[9])。但是你的数组有 9 个元素,所以 arr[9] 超出了它的范围。
【解决方案2】:

让你像这样循环,你永远不会有“off by one”错误:

for (int i = 0; i < len; i++) {
    for (int j = i+1; j < len; j++) {
        if (arr[j] < arr[i]) {
            swap(&arr[i], &arr[j]);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2018-11-13
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多