【问题标题】:Pointer array sorting in C has unexpected outputC中的指针数组排序有意外的输出
【发布时间】:2020-01-19 00:56:16
【问题描述】:
#include <stdio.h>

void sort(int *ptr, int n) {
    int i,j,tmp;
    for (i=0;i<n;i++)
        for (j=0;j<n;j++)
                if (ptr[i] < ptr[j])
                {
                    tmp=ptr[i];
                    ptr[i]=ptr[j];
                    ptr[j]=tmp;
                }
}
int main() {
    int i,n;
    int *ptr;
    printf("Nr. of elements : 5 \n");
    n=5;

    ptr=(int*)malloc( n * sizeof(int));
    for (i=0;i<n;i++) {
        scanf("%d",&ptr[i]);
    }

    printf("Initial array is : ");
    for (i=0;i<n;i++) {
        printf("%d ",ptr[i]);
    }

    sort(ptr,n);

    printf("Sorted array is : ");
    for (i=0;i<n;i++) {
        printf("%d ",ptr[i]);
    }
    return 0;
}

这是我的代码。我正在尝试使用函数对指针数组进行排序。 无论 (int) 输入是什么,它都能很好地解决。 我的困惑是我正在使用 ptr[i] &lt; ptr[j] 代替 ptr[i] &gt; ptr[j] 因为它通常应该按升序排序。 这是为什么?

【问题讨论】:

  • 只是关于提出更好问题的方法的一旁。您可以通过对特定数组进行硬编码来最大程度地减少需要共享的代码量。这样就不需要任何用户输入。

标签: c


【解决方案1】:

不,你的困惑是错误的。查看for 循环,以及ij 之间的关系。有时i &lt; j 有时i &gt; j,那么什么是“故障”并需要交换?

内部循环应该从i+1而不是'0'开始;这将使ij 之间的关系保持不变。

【讨论】:

    【解决方案2】:

    鉴于您的循环来自 i = 0 .. nj = 0 .. n,因此您的代码无法保证 i &lt; j

    有两种方法可以解决这个问题:

    void sort(int *ptr, int n) {
      int i,j,tmp;
      for (i=0; i<n; i++) {
        for (j=0; j<n; j++) {
          if (i < j && ptr[i] < ptr[j]) { // Note the changed conditional
            tmp=ptr[i];
            ptr[i]=ptr[j];
            ptr[j]=tmp;
          }
        }
      }
    }
    

    void sort(int *ptr, int n) {
      int i,j,tmp;
      for (i=0; i<n; i++) {
        for (j=i+1; j<n; j++) { // Note the changed start value
          if (ptr[i] < ptr[j]) {
            tmp=ptr[i];
            ptr[i]=ptr[j];
            ptr[j]=tmp;
          }
        }
      }
    }
    

    【讨论】:

    • ... 因为,如果 OP 不清楚,我们要建立的状态是对于每对元素,在较小索引处的值 i> 不超过较大索引处的值。这是排序的定义(按升序排列)。执行与该目标无关的比较或采取行动是没有意义的,实际上会适得其反。
    【解决方案3】:

    正如我们所见,您正在使用冒泡排序。 在冒泡排序中,我们的主要目的是将较重的元素移到末尾或将较轻的元素移到顶部。

    (ptr[i]

    您正在做的是将重元素移动到数组的末尾,这就是为什么每当您发现 ptr[j](j 是一个内部循环变量) 大于 ptr[i] (外部循环变量),你正在做一个交换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多