对数组进行排序,以便对绝对值进行排序,并在负值之前打印正值

时间:2021-06-06 09:55:30

标签: arrays c sorting absolute-value

对于给定的代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

void swap(int *xp, int *yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

void selectionSort(int arr[], int n)
{
int i, j, min_idx;

for (i = 0; i < n-1; i++)
{
    min_idx = i;
    for (j = i+1; j < n; j++)
      if (abs(arr[j]) < abs(arr[min_idx]))
        min_idx = j;
    if (abs(arr[j]) == abs(arr[min_idx])){
        if (arr[j] < arr[min_idx])
      min_idx = j;
    }
    swap(&arr[min_idx], &arr[i]);
}
}
int main()
{
int N;
scanf("%d", &N);
int i,t;
int T[N];
for(i=0;i<N;i++){
    scanf("%d",&T[i]);
}
selectionSort(T, N);
for(i=0;i<N;i++)
{printf("%d\n",T[i]);}
if(T==NULL)
{
printf("0\n");
}
 return 0;}

正值在负值之前打印 我应该怎么做才能得到输出 {1,2,-2,3-5,6,-7,11,-21,33} 用于输入 10 {-21,2,11,3,-7,-2,33,-2,6,1} 代码网址 https://ide.geeksforgeeks.org/dbGpvPBuV1

1 个答案:

答案 0 :(得分:0)

您在 j 上的循环未能使用大括号将您想要的所有语句括在循环中。您的代码是:

    for (j = i+1; j < n; j++)
        if (abs(arr[j]) < abs(arr[min_idx]))
            min_idx = j;
    if (abs(arr[j]) == abs(arr[min_idx])){
        if (arr[j] < arr[min_idx])
            min_idx = j;
    }
}

但应该是:

    for (j = i+1; j < n; j++) {
        if (abs(arr[j]) < abs(arr[min_idx]))
            min_idx = j;
        if (abs(arr[j]) == abs(arr[min_idx])){
            if (arr[j] < arr[min_idx])
                min_idx = j;
        }
    }

此外,由于您首先需要正数,因此 arr[j] < arr[min_idx] 应为 arr[j] > arr[min_idx]

通常,不要在循环外声明循环索引。删除行 int i, j, min_idx;。将 for (i = 0; i < n-1; i++) 改为 for (int i = 0; i < n-1; i++),将 for (j = i+1; j < n; j++) 改为 for (int j = i+1; j < n; j++),将 min_idx = i; 改为 int min_idx = i;。如果您首先以这种方式编写代码,编译器会警告您有关循环外错误的行,因为 j 的声明不在这些行的范围内。你会更早发现错误。