首页 > 解决方案 > C中的指针数组排序有意外的输出

问题描述

#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] < ptr[j] 而不是 ptr[i] > ptr[j] 通常应该对它进行升序排序。这是为什么?

标签: c

解决方案


鉴于您的循环从i = 0 .. nand开始j = 0 .. n,您的代码无法保证i < 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;
      }
    }
  }
}

推荐阅读