1

我正在尝试用 C 编写一个简单的程序来实现选择排序

下面是我的程序:

#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;
}

输出:

在此处输入图像描述

答案应该是

10 20 30 40 70 80

如何修复我的程序?

编辑1:

阅读 cnicutar 的答案后修复了 Temp 问题

  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;
}
4

2 回答 2

2

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

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

你应该记住最小元素的索引,改变是min不行的。arr[mystery]具体来说:您想mystery = j更改if.

于 2012-04-24T14:51:02.730 回答
0

这不应该是

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

如果没有 i+1,您将遍历已排序的值。

于 2012-04-24T14:54:24.000 回答