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

时间:2021-04-11 10:52:21

标签: arrays c sorting for-loop selection-sort

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

但输出不如预期。

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

#include <stdio.h>
int main() {
   int arr[10]={6,12,0,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

2 个答案:

答案 0 :(得分:1)

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

    int arr[10]={6,12,0,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;
        }
      }
    }

答案 1 :(得分:0)

对于这个 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,12,0,18,11,99,55,45,34,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, 12, 0, 18, 11, 99, 55, 45, 34, 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
相关问题