【问题标题】:Why this selection sort algorithm not work?为什么这种选择排序算法不起作用?
【发布时间】:2021-07-06 16:35:03
【问题描述】:

我尝试过使用单个 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 个循环.....en.wikipedia.org/wiki/Selection_sort'
  • “使用单个 for 循环”——这就是它不起作用的原因。
  • @MitchWheat 但是单双 for 循环背后的逻辑是一样的吗??

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


【解决方案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;
        }
      }
    }

【讨论】:

    【解决方案2】:

    对于这个 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;
          }
    

    在这种情况下,j 将在 if 语句之前等于 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
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2019-01-29
      相关资源
      最近更新 更多