Замена первого значения динамического массива на максимум без изменения порядка остальных - PullRequest
1 голос
/ 08 июля 2019

Я создал небольшую программу, в которой я вводил размерность массива, а затем заполнял его значениями, а затем пытался добавить функцию, в которой первое значение массива заменяется самым большим, проблема, которую яесть то, что все другие значения (если мы считаем, что они больше, чем первое) также меняются местами в процессе цикла, как мне этого избежать?

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

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Вот, пожалуйста.

#include <stdio.h>

void maxVectorSwap( int *v, size_t dim )
{
    size_t max_i = 0;

    for ( size_t i = 1; i < dim; i++ )
    {
        if ( v[max_i] < v[i] )  max_i = i; 
    }

    if ( max_i != 0 )
    {
        int tmp = v[0];
        v[0] = v[max_i];
        v[max_i] = tmp;
    }
}

int main(void) 
{
    int a[] = { 3, 5, 1, 7, 2 };
    size_t n = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    maxVectorSwap( a, n );

    for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
    putchar( '\n' );

    return 0;
}

Вывод программы:

3 5 1 7 2 
7 5 1 3 2
0 голосов
/ 08 июля 2019

Чтобы решить эту проблему, давайте оглянемся на то, каким должен быть наш подход.

Проблема: поменять местами максимальное и первое индексированное число.

Алгоритм: найти местоположение максимального числа, а затем поменять местами значения, используя их индексы.Таким образом, попробуйте сначала найти индекс, а затем попробуйте поменяться местами.

Обновленный код:

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");  
}

<- ДЕЛАЙТЕ ВВЕРХ, ЕСЛИ ОТВЕТ БЫЛ ПОЛЕЗНЫМ ->

...