#include <stdio.h>
int main() {
int arr[5];
for(int i=0; i<5; i++)
scanf("%d",&arr[i]);
for(int i=0; i<5; i++)
{
int m=arr[i];
for(int j=i+1; j <5; j++)
{
if(m>arr[j])
{
arr[i]=arr[j];
arr[j]=m;
}
}
}
for(int i=0; i<5; i++)
printf("%d ",arr[i]);
return 0;
}
为什么这个排序程序不起作用?这个程序哪里错了?该程序不对数组进行排序。哪里错了?
问题是这个if语句
if(m>arr[j])
{
arr[i]=arr[j];
arr[j]=m;
}
不更新变量的值
m
.
你需要写
if(m>arr[j])
{
arr[i]=arr[j];
arr[j]=m;
m = arr[i];
}
事实上,在内部 for 循环之前声明的变量
m
是多余的。你可以只写而不使用变量m
if ( arr[j] < arr[i] )
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
如果只交换数组中的元素一次,循环会更有效率。例如
for ( int i = 0; i < 5; i++ )
{
int m = i;
for ( int j = i + 1; j < 5; j++ )
{
if ( arr[j] < arr[m] )
{
m = j;
}
}
if ( m != i )
{
int tmp = arr[i];
arr[i] = arr[m];
arr[m] = tmp;
}
}
你可以写一个单独的函数。例如
void selection_sort( int a[], size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
size_t m = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( a[j] < a[m] )
{
m = j;
}
}
if ( m != i )
{
int tmp = a[i];
a[i] = a[m];
a[m] = tmp;
}
}
}
并称它为
selection_sort( arr, 5 );