数组a [i]按降序打印,但我的逻辑是升序

时间:2014-01-23 14:56:14

标签: c arrays sorting

你能否告诉我为什么我总是只按降序排列a[i]数组?请帮忙。

for(i=0;i<10;i++)  
{    
    for (j=0;j<10;j++)
    {   
       if(a[i]>=a[j])
       { 
          temp=a[i];
          a[i]=a[j];
          a[j]=temp;
       }
    }
}

2 个答案:

答案 0 :(得分:9)

问题是你的排序会运行两个完整的循环,比较所有ai对的j,包括i 更大的j 而不是for(i=0;i<10-1;i++) // You do not need to touch the last element, so end at 10-1 { for (j=i+1;j<10;j++) // Make it j = i+1 { if(a[i] > a[j]) // >, not >= : no need to swap when two items are equal { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } (此时您不应该交换项目)。为了使选择排序 * 起作用,它只需要从数组的未排序部分中选择其交换候选项。

以下是修复实施的方法:

{{1}}

* Selection Sort是您正在实施的排序算法的奇特名称。

答案 1 :(得分:3)

  

你能否告诉我为什么我总是只按降序排列a[i]数组?

因为您按降序实现了逻辑(比较)。改变

if(a[i]>=a[j])  

if(a[i] < a[j])  

参见代码:

#include <stdio.h>

int main()
{
int a[10] = {3,15,9,4,15,65,0,2,1,1};
int temp; 
    for(int i=0;i<10;i++)
    {
          for (int j=0;j<10;j++)
          {
             if(a[j] > a[i])
             {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
             }
          }
     }

     for(int i=0;i<10;i++)
        printf("%d ", a[i]);
}  

以下是输出的工作代码:http://ideone.com/DijpJD

排序过程的步骤:仅显示发生更改的步骤。

Pass 1: 15   3   9   4  15  65   0   2   1   1  
        65   3   9   4  15  15   0   2   1   1      

Pass 2:  3  65   9   4  15  15   0   2   1   1  

Pass 3:  3   9  65   4  15  15   0   2   1   1  

Pass 4:  3   4  65   9  15  15   0   2   1   1  
         3   4   9  65  15  15   0   2   1   1  

Pass 5:  3   4   9  15  65  15   0   2   1   1  

Pass 6:  3   4   9  15  15  65   0   2   1   1      

Pass 7:  0   4   9  15  15  65   3   2   1   1  
         0   3   9  15  15  65   4   2   1   1  
         0   3   4  15  15  65   9   2   1   1  
         0   3   4   9  15  65  15   2   1   1  
         0   3   4   9  15  15  65   2   1   1 

Pass 8:  0   2   4   9  15  15  65   3   1   1  
         0   2   3   9  15  15  65   4   1   1  
         0   2   3   4  15  15  65   9   1   1  
         0   2   3   4   9  15  65  15   1   1  
         0   2   3   4   9  15  15  65   1   1  

Pass 9:  0   1   3   4   9  15  15  65   2   1  
         0   1   2   4   9  15  15  65   3   1  
         0   1   2   3   9  15  15  65   4   1  
         0   1   2   3   4  15  15  65   9   1  
         0   1   2   3   4   9  15  65  15   1  
         0   1   2   3   4   9  15  15  65   1  

Pass 10: 0   1   1   3   4   9  15  15  65   2  
         0   1   1   2   4   9  15  15  65   3  
         0   1   1   2   3   9  15  15  65   4  
         0   1   1   2   3   4  15  15  65   9  
         0   1   1   2   3   4   9  15  65  15  
         0   1   1   2   3   4   9  15  15  65