【问题标题】:Bubble-Sort not sorting in C (Cormen's pseudocode)冒泡排序不在 C 中排序(Cormen 的伪代码)
【发布时间】:2019-01-16 08:17:42
【问题描述】:

所以我试图实现Cormen's pseudocode 进行冒泡排序,但我似乎无法让它工作。

这是我对 Cormen 伪代码的处理方法:

void BUBBLE_SORT(int a[200], int n) {
    int i, j, aux;

    for (i = 1; i <= n - 1; i++) {
        for (j = n; j < i + 1; j++) {
            if (a[j] < a[j - 1]) {
                aux = a[j];
                a[j] = a[j + 1];
                a[j + 1] = aux;
            }
        }
    }
}

我尝试了在互联网上找到的另一段代码,但结果没有什么不同:

void bubbleSort(int arr[], int n) {
    int i, j;     
    for (i = 0; i < n - 1; i++)          
        for (j = 0; j < n - i - 1; j++)  
            if (arr[j] > arr[j + 1]) 
                swap(&arr[j], &arr[j + 1]);  
}

我很想知道我的理解在理解 Cormen 的实现方面失败的地方,并让冒泡排序发挥作用!

【问题讨论】:

  • 它看起来不正确,在您的 if 条件下,您将 a[j] 与 a[j-1] 进行比较,但如果交换也应将 a[j] 与 a[j+1] 交换和条件一样吗?
  • for(j=n;j&lt;i+1; - 如果j = ni &lt; nj 怎么会小于i?你的内部循环没有意义。
  • 嗯,我也这么认为。但是伪代码不是这么说的吗?我的意思是第 2 行:j=a.length。顺便说一句,“downto”指的是什么? “
  • @pustiul500 这意味着循环倒计时而不是倒计时。它不是在每次迭代后递增循环变量,而是递减它,目标值不是上限,而是下限。例如,for i = 1 to 10 从 1 计数到 10(1、2、3、...),但 for i = 10 downto 1 从 10 计数到 1(10、9、8、...)。

标签: c arrays sorting bubble-sort


【解决方案1】:

至少存在三个问题:

  1. 伪代码假定数组索引从1length。在 C 中,数组的索引从 0length-1;您的代码对此不正确。

  2. 伪代码中的内循环变为 downto i+1,但您的内循环试图计数

    for(j=n;j<i+1;j++)
    

    应该是

    for (j = n; j > i; j--)
    
  3. 伪代码交换 A[j]A[j-1],但您的 C 代码交换 A[j]A[j+1]

【讨论】:

  • 据我所知,Cormen 的所有 for 都是从 1 开始的,而忽略了 0。我按照你的建议进行了更改,尽管我让 for 从 1 开始,它知道有效。一个问题,如果你愿意的话:我是否正确解释了伪代码?如果是这样,为什么它不起作用,而不是“ji;j--”?
  • 不,pustiul,从 1 开始时它不会工作。该示例使用数组 1..n,但如前所述,C 数组是 0..n-1。不要试图变得聪明;努力学习吧。
  • @pustiul500,您没有正确解释伪代码,特别是,您将单词 downto 更改为 upto(Melpomene 的第二条评论)。
  • 我确实在努力学习。但这是我们整个学期的教学方式,从 1 开始,基于 Cormen 的书,以免以后混淆我们。我会再次修改所有内容,并尝试从另一个角度看待它。
【解决方案2】:

实施中的错误:

  1. 您从第 1 个索引开始计算数组。但是在 C 编程中,数组从第 0 个位置开始。 [你应该正确 i = 0 而不是 i = 1]
  2. 内部循环必须从 j = n-1j = i+1j 的值必须在减少。
  3. 您将 a[j]a[j-1] 进行比较,但您交换了 a[j]a[j+1]。您应该将 a[j]a[j-1] 交换

请参阅下面代码中的更改。希望对你有用:

int i, j, aux;
for(i=0;i<n-1;i++){
    for(j=n-1;j>=i+1;j--){
        if(a[j]<a[j-1]){
            aux=a[j];
            a[j]=a[j-1];
            a[j-1]=aux;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2017-10-21
    • 2014-03-26
    • 2018-11-13
    • 2013-04-30
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多