c - 将动态数组的第一个值与最大值交换而不改变其余值的顺序

标签 c dynamic-arrays

我做了一个小程序,我输入一个数组的维度,然后用值填充它,然后我尝试添加一个函数,其中数组的第一个值与最大的值交换,问题我有一个问题是所有其他值(如果我们考虑它们比第一个值大)在循环过程中也会被交换,我该如何避免这种情况?

void maxVectorSwap(int *v, int dim){
int i;
int app;
int max=0;
for(i=0;i<dim;i++){    
    max=v[0];
    if(v[i]>max){
        app=v[0];
        v[0]=v[i];
        v[i]=app;

    }   
}

printf("----------\n");
for(i=0;i<dim;i++){
    printf("v[%d]=%d\n",i,v[i]);                                       
}
printf("----------\n");  
}

假设我输入数组的维度为5,值为:

3 5 1 7 2

我用这个函数得到的结果是:

7 3 1 5 2

这表明有更多的交换,我想要的只是看到 7 和 3 交换,所以它看起来像这样:

7 5 1 3 2

最佳答案

为了解决这个问题,让我们回顾一下我们的方法应该是什么。

问题:交换最大和第一个索引数。

算法:找到最大数字所在的位置,然后使用它们的索引交换值。 因此先尝试找到索引,然后再尝试交换。

更新代码:

void maxVectorSwap(int *v, int dim)
{
    int i;
    int app;

    //Lets assume the first element is the largerst number i.e index=0
    int indexOfMax=0;

    for(i=0;i<dim;i++)
    {    
        if(v[i]>v[indexOfMax])
        {
            indexOfMax=i;
            // store the updated maximum index in m
        }   
    }

    // now indexOfMax stores the location of the maximum number
    //Thus swapping now
    int temp=v[0];
    v[0]=v[indexOfMax];
    v[indexOfMax]=temp;

    printf("----------\n");
    for(i=0;i<dim;i++){
        printf("v[%d]=%d\n",i,v[i]);                                       
    }
    printf("----------\n");  
}

关于c - 将动态数组的第一个值与最大值交换而不改变其余值的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56940086/

相关文章:

c - 使用 strtok,最后一个标记带有一个行分隔符

无法获取字符串中的单个字符

在同一个函数中调用 MPI_Barrier 两次可以吗?

c - 是否有一种单宏方法来为 C 宏参数添加前缀和引号

c - 返回两个指向动态数组的指针

c++ - C++ 中附加的 char* 的奇怪输出

c - C 中 CHAR * 的位运算

无法使用指针为结构创建动态数组

c++ - 如何在 C++ 中使用字符串文字初始化动态字符数组?

c++ - 数组而不是 vector 的 vector ,元素的 push_back()。 C++