C语言如何将数组的第一个数与最小值兑换后输出,最大值与最后一个值兑换后输出

问题遇到的现象和发生背景

我想到了选择性排序,但是调换后
1.最小的确实在最前面,但第一个数不在最小的数的原始位置
2.最大值不在最后面

用代码块功能插入代码,请勿粘贴截图
#include 
   void sort(int *a)
   {
       int j,temp1,temp2;
            for(j=1;j<10;j++)
            {
                if(a[0]>=a[j])
                {
                    temp1=a[0];
                    a[0]=a[j];
                    a[j]=temp1;
                }
            }
            for(int i=0;i<9;i++)
            {
                if(a[9]<=a[j])
                {
                    temp2=a[9];
                    a[9]=a[j];
                    a[9]=temp2; 
                }
            }
        printf("调整后的数组为:\n");
        for (int k=0;k<10;k++)
        {
            printf("%d ",a[k]); 
         } 
        return;       
   }
   int main()
{
    int arr[10],*p; 
    printf("请输入十个数:\n");
    for(int i=0;i<10;i++)
    {
    scanf("%d",&arr[i]);
    }
    p=arr;
    sort(p); 
    return 0;
 } 

运行结果及报错内容

img

修改如下,供参考:

#include <stdio.h>
void sort(int* a,int n)
{
    int i, temp, max_i = 0, min_i = 0;
    for (i = 0; i < n; i++)//查找最大最小值位置
    {
        if (a[i] > a[max_i])
            max_i = i;
        if (a[i] < a[min_i])
            min_i = i;
    }
    temp = a[0];  //第一个数与最小值兑换
    a[0] = a[min_i]; 
    a[min_i] = temp;

    if (max_i == 0) 
        max_i = min_i; //如果最大值在第一个位置,则现在已经移动到 a[min_i]位置了

    temp = a[n - 1];  //最大值与最后一个值兑换
    a[n - 1] = a[max_i]; 
    a[max_i] = temp;

    printf("调整后的数组为:\n");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);
    return;
}
int main()
{
    int arr[10], * p;
    printf("请输入十个数:\n");
    for (int i = 0; i < 10; i++)
        scanf("%d", &arr[i]);
    p = arr;
    sort(p, 10);
    return 0;
}

定义变量max和min来记录最大最小数就行,之后和第一和最后的交换就可以

你要先定义max_idx和min_idx来存最大值最小值的位置,一开始让它们都是0
然后循环里判断a[i]和a[max_idx]的大小,如果a[i]更大,就max_idx=i
当你循环完毕之后,才进行交换
不要没循环完就着急交换,没循环完你怎么知道那个是最大值呢