使用备用最小 - 最大值对数组进行排序

时间:2016-03-25 20:26:05

标签: c arrays sorting

给定一个数组我需要对它进行排序,使得第一个元素是最小的值,第二个元素是最大的元素,第三个元素是第二个最小的元素,依此类推。

但我的代码只打印原始数组,我无法弄清楚原因。任何建议将不胜感激。

#include <stdio.h>
void swap(int m, int n);
int main()
{
    int i,j,A[10],n;

    printf ("enter the number of array elements\n");
    scanf ("%d", &n);

    for (i=0;i<n;i++){
       scanf ("%d", &A[i]);
    }


    for (i=0;i<n;i++){

        if (i%2 == 0){
            for (j=i;j<n;j++){
                if (A[j] < A[i]){
                    swap(A[i],A[j]);
                }
            }
        }
        else if (i%2 != 0){
            for (j=i;j<n;j++){
                if (A[j] > A[i]){
                    swap (A[i],A[j]);
                }
            }
        }

    }

    for(i=0;i<n;i++){
        printf ("%d\n", A[i]);
    }
    return 0;
}

void swap( int m, int n)
{
    int temp;
    temp = m;
    m = n;
    n = temp;
}

2 个答案:

答案 0 :(得分:1)

您需要使用指针传递引用。

void swap( int *m, int *n)
{
    int temp;
    temp = *m;
    *m = *n;
    *n = temp;
}

并更改您的代码以便像这样调用

swap (&A[i],&A[j]);

对于不使用指针的解决方案,您可以使用像这样的MACRO;

#define swap(x,y) do{int t=(x);(x)=(y);(y)=t;}while(0);

swap(A[i],A[j]);

只需在文件顶部定义,然后删除交换功能和原型。这都是关于范围的,因为MACRO只是一个文本替换它在正确的范围内使用A [i]。

答案 1 :(得分:0)

我在你的程序中注意到的第一个问题是你的交换功能。在交换函数中,参数是原始数据类型。因此,该函数创建整数副本&#34; m&#34;和&#34; n&#34;,并在函数swap范围内切换值。但是一旦函数返回,你就没有真正交换任何东西。要实际交换在main中创建的数组中的值,您需要通过引用进行传递(将指针传递给您尝试交换的变量)。修改你的交换函数,如下所示:

void swap( int *m, int *n)
{
   int temp;
   temp = *m;
   *m = *n;
   *n = temp;
}

然后在main中,使用&运算符(地址)传入数组中该值的地址。以下是一个示例:swap (&A[i],&A[j]);

其他建议:

  1. 格式化代码,以便for循环中的条件之间有空格。
  2. 添加评论。