将动态数组的第一个值与最大值交换而不改变其余值的顺序
Swapping the first value of a dynamic array with the maximum without changing the order of the rest
我做了一个小程序,我输入一个数组的维度,然后用值填充它,然后我尝试添加一个函数,其中数组的第一个值与最大的值交换,即我遇到的问题是所有其他值(如果我们考虑它们比第一个值大)在循环过程中也会被交换,我该如何避免这种情况?
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");
}
给你。
#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
我做了一个小程序,我输入一个数组的维度,然后用值填充它,然后我尝试添加一个函数,其中数组的第一个值与最大的值交换,即我遇到的问题是所有其他值(如果我们考虑它们比第一个值大)在循环过程中也会被交换,我该如何避免这种情况?
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");
}
给你。
#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