0

到目前为止,我的程序根据用户声明的大小创建了一个数组。然后程序用 500 到 600 之间的随机数填充该数组,并打印其中的 4 个数字并创建一个新行以继续打印它们。到目前为止一切正常。在假设按升序重新打印数字的部分出现问题,它仅重新打印一些数字而不是按任何顺序。任何有关如何纠正此问题的帮助表示赞赏。

int main(){
            int size;
            int j, i;
        int temp;
        int a=0;
        double sum = 0;


        printf("Enter size of array ");
        scanf("%d", &size);


        int* array;
        array=malloc(size * sizeof(*array));
        int *aPtr = array;

        srand(time(NULL));
        for (i = 0; i < size; i++){
             aPtr[i] =(rand() % 101) + 500;
             printf("%d ", aPtr[i]);
             a++;
             if (a == 4){
            printf("\n");
            a = 0;
            }


      }
        printf("\n\n\nIn ascending order\n");
        for (i = 0; i< size; i++){
             for (j = 0; j < size; j++){
            if(aPtr[i] > aPtr[j]);
                temp=aPtr[i];
                aPtr[i]=aPtr[j];
                    aPtr[j]=temp;
                    }
                printf("%d\n", aPtr[i]);
            }
4

2 回答 2

0

问题是 < 符号的结果,并且 if 语句不在其自己的括号中。用于打印的第二个 for 循环也有助于正确打印数组

 printf("\n\n\nIn ascending order\n");
        for (i = 0; i < size; i++){
             for (j = i+1; j < size; j++){
            if(aPtr[i] > aPtr[j]){
                temp=aPtr[i];
                aPtr[i]=aPtr[j];
                    aPtr[j]=temp;
            }
            }
            }
            for (j = 0; j<size; j++)                
            printf("%d\n", aPtr[j]);
于 2012-09-23T22:17:43.033 回答
0

问题是排序循环中的 if-test(重新格式化):

for (i = 0; i< size; i++){
    for (j = 0; j < size; j++){
        if(aPtr[i] > aPtr[j]);
        temp=aPtr[i];
        aPtr[i]=aPtr[j];
        aPtr[j]=temp;
    }
    printf("%d\n", aPtr[i]);
}

无论如何,您都在交换每个值,因为您没有在 if 块中放置任何内容。这应该以最少的更改来修复您的代码:

for (i = 0; i< size; i++){
    for (j = 0; j < size; j++){
        if(aPtr[i] > aPtr[j]) {
            temp=aPtr[i];
            aPtr[i]=aPtr[j];
            aPtr[j]=temp;
        }
    }
    printf("%d\n", aPtr[i]);
}

请注意,使用冒泡排序,您只需要搜索最小元素的索引并交换一次。您每次都在交换,这是非常多余的。您也不需要在内j循环中从零开始循环,因为之前的所有内容i都已经排序。

int minidx;
for (i = 0; i< size; i++) {
    /* Find index of smallest element in the rest of the array */
    minidx = i;
    for (j = i+1; j < size; j++) {
        if(aPtr[j] < aPtr[minidx]) minidx = j;
    }

    /* Swap if necessary */
    if (minidx != i ) {
        temp = aPtr[i];
        aPtr[i] = aPtr[minidx];
        aPtr[minidx] = temp;
    }

    /* The element at i is now sorted */
    printf("%d\n", aPtr[i]);
}
于 2012-09-23T22:18:21.070 回答