【问题标题】:Sorting an array with alternate smallest-largest values使用交替的最小值-最大值对数组进行排序
【发布时间】:2016-07-13 15:43:06
【问题描述】:

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

但是我的代码只是打印了原始数组,我不知道为什么。任何建议将不胜感激。

#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;
}

【问题讨论】:

  • 如果您想要内联就地交换,试试这个:A[i] ^= A[j] ^= A[i]; 并完全消除交换功能。您也可以为此使用宏。
  • void swap(int A[], int i, int j); 也可以。致电swap(A,i,j)
  • @Quirk:不好的建议。使用交换函数使代码更具可读性,并且异或链也不太直观,并且在现代代码中没有任何优势,并且对于优化不佳的编译器可能不太有效。
  • @Olaf:同意。但是 OP 不想与指针有任何关系。按值传递整个数组也不是一个好习惯。异或交换是在宏下进行高效交换的一种很好的方式。
  • @Quirk:对于大多数用途(以及对其元素的所有访问),数组衰减为指针。没有什么可争论的,只需阅读标准即可。在 C 中学习指针 after 数组只是简单的坏教法。

标签: c arrays sorting


【解决方案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]。

【讨论】:

  • 我问是因为我大学的编程课程还没有涵盖指针。
  • @user34304 按值传递将限制您解决范围问题。您需要使用指针引用。
  • 如果您想要内联就地交换,试试这个:A[i] ^= A[j] ^= A[i];
  • #define swap(x,y) {int t = x;x=y;y=t;} 并删除您的功能。现在你把它叫做 swap(A[i],A[j]);
  • @user34304:奇怪:他们在 before 指针之前引入了数组?在 C 语言中,如果不使用指针,您将无法对数组做任何有用的事情。
【解决方案2】:

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

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

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

其他建议:

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多