使用交替的最小值-最大值对数组进行排序
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 中,使用 &
运算符(地址)传入数组中该值的地址。这是一个例子:swap (&A[i],&A[j]);
其他建议:
-
格式化您的代码,以便您的 for 循环中的条件之间有空格。
添加 cmets。
【讨论】:
以上是关于使用交替的最小值-最大值对数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章
第三节 java 数组(循环遍历获取数组的最值(最大值和最小值)选择排序冒泡排序练习控制台输出大写的A)
用JAVA编写一个程序,计算一维数组中的最大值、最小值及其差值