使用交替的最小值-最大值对数组进行排序

Posted

技术标签:

【中文标题】使用交替的最小值-最大值对数组进行排序【英文标题】: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 数组只是简单的坏教法。 【参考方案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) doint 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]);

其他建议:

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

【讨论】:

以上是关于使用交替的最小值-最大值对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

第三节 java 数组(循环遍历获取数组的最值(最大值和最小值)选择排序冒泡排序练习控制台输出大写的A)

Pandas 根据列中的最小值到最大值对行进行重新排序

把数组中的数拼接起来,求最大值

用JAVA编写一个程序,计算一维数组中的最大值、最小值及其差值

b_lc_数组中最大数对和的最小值(排序+思维 | 进阶:第k)

java输入5个数输出最大和最小值