分析:
1.获取数组中最大值和最小值及其下标
2.将其调换到相应位置
注意事项:
1.避免重复交换
2.考虑特殊情况(如首位极值相反或已对应)
水平有限,望各位在评论区共同讨论。
#include "stdio.h"
#include "stdlib.h"
void get_ex_val_pos(int *n, int *max, int *min, int *max_p, int *min_p); //声明
int main(void)
{
int num[10], i;
int max, min;
int max_p, min_p;
printf("Please enter ten nums:\n");//接收值
for (i = 0; i < 10; i++)
{
scanf("%d", (num + i));
}
get_ex_val_pos(num, &max, &min, &max_p, &min_p);//调用函数
if (*num == *(num + max_p) && *(num + 9) == *(num + min_p))//首位极值相反的特殊情况单独判断
{
*(num + min_p) ^= *num ^= *(num + min_p) ^= *num;
}
if (*num != *(num + min_p) || *(num + 9) != *(num + max_p))//普通判断
{
*(num + min_p) ^= *num ^= *(num + min_p) ^= *num;
*(num + max_p) ^= *(num + 9) ^= *(num + max_p) ^= *(num + 9);
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(num + i));//输出
}
system("pause");
}
void get_ex_val_pos(int *n, int *max, int *min, int *max_p, int *min_p)//获取数组内极值及下标
{
int i;
*max = *min = *n; //初始化数值
for (i = 1; i < 10; i++)
{
if (*max < *(n + i))
{
*max = *(n + i);
*max_p = i;
}
}
for (i = 1; i < 10; i++)
{
if (*min > *(n + i))
{
*min = *(n + i);
*min_p = i;
}
}
}