0

動的メモリ割り当てを使用して最大数を見つけるプログラムを作成します。私は次のコードを書きました 。ポインタによるselectinソートを行っているソート部分に
問題があります。
しかし、ソートは適切に行われません.....ポインタによる選択ソートを行うことはできますか?私は正しいアプローチを適用していますか?

         #include<stdio.h>
         #include<stdlib.h>  
         main()
         {

            int i,j,n,temp;
            int *data;
            printf("enter total no of elements:");
            scanf("%d",&n);
            data=(int*)calloc(n,sizeof(int));
            printf("\n");
            for(i=0;i<n;i++)
            {
                         printf("enter number %d:",i+1);
                         scanf("%d",data+i);
            }
           for(i=0;i<n;i++)
           {
                   printf("%d\t",*(data+i));
            }
           printf("\n");
           for(i=0;i<n;i++)
           {
                   for(j=i+1;j<n;j++)
               {
                       if(*(data)>*(data+j))
                   {
                        temp=*(data);
                        *(data)=*(data+j);
                        *(data+j)=temp;
                    }
               }


            }
            for(i=0;i<n;i++)
            {
                 printf("%d\t",*(data+i));
            } 
            printf("largest element is %d\t",*(data+n-1));
         } 

出力:

         enter total no of elements:5

         enter number 1:2
         enter number 2:10
         enter number 3:12
         enter number 4:1
         enter number 5:0
         2  10  12  1   0   
         0  10  12  2
4

6 に答える 6

2

コードを少し変更する必要があります

   for(i=0;i<n-1;i++) //change here
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data+i)>*(data+j)) //here
               {
                    temp=*(data+i);      //here
                    *(data+i)=*(data+j); //here
                    *(data+j)=temp;
                }
           }  

あなたは常に最初の要素(*data)とを比較してい*(data+j)ます。*(data+i)と比較する必要があります。*(data+j)

于 2013-10-23T14:48:26.267 に答える
1

これは、常に最初の要素と比較しているためです。そのはず

for(i=0;i<n;i++)
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data+i)>*(data+j))
               {
                    temp=*(data+i);
                    *(data+i)=*(data+j);
                    *(data+j)=temp;
                }
           }


        }
于 2013-10-23T15:09:25.497 に答える
1

このセクション:

if(*(data)>*(data+j))
{
    temp=*(data);
    *(data)=*(data+j);
    *(data+j)=temp;
}

data[0]最初の要素 ( ) と要素 j ( )のみを考慮していdata[j]ます。

あなたは本当にdata[i]vsを検討するつもりだと思います.data[j]


自問する質問

  • for(i)なぜループを書いたのですか?
  • 変数iは実際にどこで使用されていますか?
于 2013-10-23T14:49:42.433 に答える
0
       for(i=0;i<n;i++)
       {
               for(j=i+1;j<n;j++)
           {
                   if(*(data)>*(data+j))
               {
                    temp=*(data);
                    *(data)=*(data+j);
                    *(data+j)=temp;
                }
           }


        }

n-1 まで実行される外側の for ループを通じて何を達成しましたか?

于 2013-10-23T14:56:56.047 に答える