微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个选择排序算法不起作用?

如何解决为什么这个选择排序算法不起作用?

我尝试过使用单个 for 循环的选择排序算法。

输出不如预期。

这段代码有什么错误吗?请帮忙。

#include <stdio.h>
int main() {
   int arr[10]={6,12,18,11,99,55,45,34,2};
   int n=10;
   int i=0,j,swap;
 
      for (j =1; j <n; j++) {
          if(j==(n-1)){
              i++;
              j=i+1;
          }
          
         if (arr[i] > arr[j]){
           swap = arr[j];
           arr[j] = arr[i];
           arr[i] = swap;}
     
     
      }
    for (int jj = 0; jj < n; jj++)
      printf("%d\t",arr[jj]);

   return 0;
}


output:  0       6       11      12      18      34      45      55      0       99

解决方法

选择排序使用两个 for 嵌套循环。试试这个代码:

    int arr[10]={6,12,18,11,99,55,45,34,2};
    int n = 10;
    for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) {
        if (arr[i] > arr[j]) {
            int swap = arr[i];
            arr[i] = arr[j];
            arr[j] = aux;
        }
      }
    }
,

对于这个 if 语句的初学者

     if (arr[i] > arr[j]){
       swap = arr[j];
       arr[j] = arr[i];
       arr[i] = swap;}

使用了未声明的变量 swap。你必须写

     if (arr[i] > arr[j]){
       int swap = arr[j];
       arr[j] = arr[i];
       arr[i] = swap;}

其次,我无法获得您显示的输出。如果要编写如上所示的更新程序,则其输出为

0   6   11  12  18  34  45  55  2   99

你的 for 循环的问题是,由于这个 if 语句,只有当 i 等于 n-2 时,数组的最后一个元素才参与算法

      if(j==(n-1)){
          i++;
          j=i+1;
      }

在这种情况下,在这个 if 语句之前 j 将等于 n-1

     if (arr[i] > arr[j]){
       int swap = arr[j];
       arr[j] = arr[i];
       arr[i] = swap;}

按照以下方式重写您的 for 循环,如下所示在您更新的程序中

#include <stdio.h>
int main() {
   int arr[10]={6,2};
   int n=10;
   int i=0,j;
 
      for (j =i; j <n; ) {
         if (arr[i] > arr[j]){
           int swap = arr[j];
           arr[j] = arr[i];
           arr[i] = swap;}
     
            if( ++j== n ){
              i++;
              j=i+1;
          }
          
   
      }
    for (int jj = 0; jj < n; jj++)
      printf("%d\t",arr[jj]);

   return 0;
}

在这种情况下,程序输出是

0   2   6   11  12  18  34  45  55  99

请注意,您的方法效率低下,因为数组元素有许多冗余交换。

选择排序方法的实现最好使用传统的方式。例如

#include <stdio.h>

void selection_sort( int a[],size_t n )
{
    for ( size_t i = 0; i + 1 < n; i++ )
    {
        size_t min_pos = i;
        
        for ( size_t j = i + 1; j < n; j++ )
        {
            if ( a[j] < a[min_pos] ) min_pos = j;
        }
        
        if ( min_pos != i )
        {
            int tmp = a[i];
            a[i] = a[min_pos];
            a[min_pos] = tmp;
        }
    }
}

int main( void ) 
{
    int a[] = { 6,2 };
    const size_t N = sizeof( a ) / sizeof( *a );
    
    selection_sort( a,N );

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

    return 0;
}

程序输出为

0   2   6   11  12  18  34  45  55  99

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。