1

Selection Sortを実装するために 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 の回答を読んだ後の温度の問題を修正

  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

少なくとも 2 つの問題: あなたの「スワップ」が間違っています:

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

そして、最小要素のインデックスを覚えておく必要があります。変更してminもうまくいきません。具体的には、 のarr[mystery]どこを変更したいかです。mystery = jif

于 2012-04-24T14:51:02.730 に答える
0

これはすべきではありません

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

i + 1がないと、すでにソートした値を反復処理していることになります。

于 2012-04-24T14:54:24.000 に答える