选择排序程序产生错误输出

时间:2012-04-24 14:46:58

标签: c arrays sorting

我正在尝试在C中创建一个简单的程序来实现Selection Sort

以下是我的计划:

#include<stdio.h>
#include<conio.h>

int main(void)
{
  int min, total, *arr,i,j,temp;

  clrscr();
  printf("Enter the size of array : ");
  scanf("%d",&total);
  arr = (int *) malloc(total * sizeof(int));

  for(i = 0; i<total; i++)
  {
    printf("\nEnter element %d: ", i+1);
    scanf("%d", &arr[i]);
  }

  min = arr[0];
  for(i = 0; i<total; i++)
  {
    for(j = i; j<total; j++)
    {
      if(arr[j]<min)
      { min=arr[j]; }
    }

    min = temp;
    min = arr[i];
    arr[i] = min;
  }

  for(i = 0; i<total; i++)
  {
    printf("%d \t", arr[i]);
  }

  getch();
  return 0;
}

输出:

enter image description here

答案应该是

10 20 30 40 70 80

如何修复程序?

编辑1:

阅读cnicutar的回答后修正了临时问题

  min = arr[0];
  for(i = 0; i<total; i++)
  {
    for(j = i; j<total; j++)
    {
      if(arr[j]<min)
      { 
    min=arr[j]; 
    min_index = j;
      }
    }

       temp = a[i];
       a[i] = min;
       a[min_index] = temp;
  }

现在,我得到上述输入值:10 10 10 20 10 10

编辑2:

发现问题,该程序对所有迭代使用相同的最小值

#include<stdio.h>
#include<conio.h>

int main(void)
{
  int min, min_index, total, *arr,i,j,temp;

  clrscr();
  printf("Enter the size of array : ");
  scanf("%d",&total);
  arr = (int *) malloc(total * sizeof(int));

  for(i = 0; i<total; i++)
  {
    printf("\nEnter element %d: ", i+1);
    scanf("%d", &arr[i]);
  }

  min = arr[0];               //           min = arr[0] = 70              ||   min = 10     <-- Problem          
  for(i = 0; i<total-1; i++)  //           i = 0                          ||                 
  {                           //                                          ||
    for(j = i; j<total; j++)  //           j = i = 0                      ||                
    {                         //                                          ||                          
      if(arr[j]<min)          //           30<70     ; 40<30 ; 10<30      ||                                   
      {                       //                                          ||
    min=arr[j];               //           min = 30  ;       ; min = 10   ||                                            
    min_index = j;            //           index = 1 ;       ; index = 3  ||                                                                    
      }                       //                                          ||
    }                         //                                          ||
                              //                                          ||
    if(min!=arr[i])           //                                          ||
    {                         //                                          ||
       temp = arr[i];         //                                          ||
       arr[i] = min;          //                                          ||
       arr[min_index] = temp; //     After swap:     10 30 40 70 80 20    ||
    }
    min = arr[i+1];           // (Add this to fix the problem)  
  }

  for(i = 0; i<total; i++)
  {
    printf("%d \t", arr[i]);
  }

  getch();
  return 0;
}

2 个答案:

答案 0 :(得分:2)

至少有两个问题:你的“交换”错了:

min = temp;
min = arr[i];
arr[i] = min;

你应该记住最小元素的索引,改变min不会。具体来说:您想要更改arr[mystery]mystery = j的{​​{1}}。

答案 1 :(得分:0)

不应该是

for(j = i+1; j<total; j++)
{

没有i + 1,你正在迭代你已经排序过的值。