我在 c 中实现了这个排序程序。为什么这不起作用?

问题描述 投票:0回答:1
#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;
}

为什么这个排序程序不起作用?这个程序哪里错了?该程序不对数组进行排序。哪里错了?

c sorting if-statement nested-loops selection-sort
1个回答
1
投票

问题是这个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 );
© www.soinside.com 2019 - 2024. All rights reserved.