2012-02-22 14 views
2

私は、整数配列の最大整数を選択し、それをa [n-1]の位置に配置する単純な(?)選択ソートプログラムをCで作成しようとしています[n-2]などの中で最大の数であり、最小の数が[0]になるまで続く。私は紙の下のコードを実行し、それは動作するはずだと思われるが、私はそれをコンパイルするときに私は間違った結果を得ている。私は明白な何かを欠いていますかCでの配列の選択ソート

/* The program implements selection sort*/ 

#include <stdio.h> 
#include "simpio.h" 

#define n 5 

void GetArray(int a[]); 
void SelectionSort(int a[]); 
int FindMax(int a[], int high); 
void swap(int a[], int p1, int p2); 
void PrintArray(int a[]); 

main() 
{ 
     int a[n]; 
     GetArray(a); 
     SelectionSort(a); 
     PrintArray(a); 
     getchar(); 
} 

void GetArray(int a[]) 
{ 
    int i; 
    for(i=0;i<n;i++) 
    { 
     printf("Enter integer# %d", i+1); 
     a[i]=GetInteger(); 
    } 
} 

void SelectionSort(int a[]) 
{ 
    int i, max; 
    for(i=0;i<n;i++) 
    { 
      max=FindMax(a,i); 
      swap(a,max,(n-1-i)); 
    }  
} 

int FindMax(int a[], int high) 
{ 
    int i, index; 
    index=high; 
    for(i=high;i<n;i++) 
    { 
     if(a[i]>a[index]) 
      index=i; 
    } 
    return index; 
} 

void swap(int a[], int p1, int p2) 
{ 
    int temp; 
    temp=a[p2]; 
    a[p2]=a[p1]; 
    a[p1]=temp; 
} 

void PrintArray(int a[]) 
{ 
    int i; 
    for(i=0;i<n;i++) 
     printf("a[%d]=%d\n", i, a[i]); 
} 
+3

あなたはその行動は、あなたが期待するものから分岐点を見つけるまで、デバッガを介して実行、紙の上にそれをしようとしないでください。 –

+0

私はOliに同意します - 問題がどこにあるか絞り込むことができれば、一般的に質問からより良い回答を得ることができます。デバッガやプリントステートメントはこれを行うのに役立ちます。質問することなく問題を見つけることさえできます。 –

+1

"私は結果が間違っています。"どの入力が結果を作成しますか?サンプル入力を行い、実際に何を得るかを示します。 – abelenky

答えて

1

変更これらの方法に:

void SelectionSort(int a[]) 
{ 
    int i, max; 
    for(i=0;i<n;i++) 
    { 
      max=FindMax(a,n-i-1); 
      swap(a,max,n-i-1); 
    }  
} 

int FindMax(int a[], int high) 
{ 
    int i, index; 
    index=high; 
    for(i=0;i<high;i++) 
    { 
     if(a[i]>a[index]) 
      index=i; 
    } 
    return index; 
} 

私は実際に私の答えをテストし、それが動作します。

+0

トピックを外していますが、PhpBBサポートフォーラムから来ましたか?私はあなたを認識していると思う:-)しかし、それは私のために働いているようだ、私は私の前のコードを見て、私が間違っていたかを見なければならない。 – Joshpho

+0

いいえ、実際のP​​HPは一度も実行されていません。しかし、私が助けることができてうれしい): – Steve

0

ないでください。

 max=FindMax(a,i); 
     swap(a,max,(n-1-i)); 

う:

 max=FindMax(a,i); 
     swap(a,max,i); 

そうでない場合は、ループを通る次回は、あなたが配列でトップの位置に同じ最大値を見つけることができます。

+0

しかし、最高の数字は[0]などに入れられませんか? – Joshpho

+0

それは本当です。あなたの現在のバージョンには、ソートをソートするためのSelectionSortがありますが、昇順ソートのためのFindMaxがあります。ダニエルの答えはあなたのためにFindMaxを修正します。 –

0

選択の非常に基本的な実装ソート

#include<stdio.h> 
main() 
{ 
     int i,j,n=7,a[]={1,2,5,3,8,9,5},key; 
     for(j=1;j<n;j++) 
     { 
         key=a[j]; //a[j] is the new element to be added to the sorted 
            //sequence 
         i=j-1;  
         while(i>=0 && key<a[i]) //traverse through the sorted sequence 
         {a[i+1]=a[i];i--;}  //until the place of key is found 
         a[i+1]=key;    
     } 
     for (j=0;j<n;j++) 
     printf("%d",a[j]); 
} 
-1
#include<stdio.h> 
#include<conio.h> 
int removex(int arr[],int small,int n) 
{ 
    int i=0; 
    for(;i<n;i++) 
     if(arr[i]==small) //searching that no to delete 
      break; 
    for(;i<n-1;i++) 
     arr[i]=arr[i+1]; //delete by overloading no 
    return n-1; 
} 
void selectSort(int arr[],int sort[],int n) 
{ 
    int j=0,k=0,small; 
    while(n!=0) 
    { 
     small=arr[0]; 
     for(j=0;j<n;j++) 
      if(arr[j]<small) 
       small=arr[j]; //finding smallest no 
     sort[k++]=small; 
     n=removex(arr,small,n); //removing that from list as we included that no into sorted list 
    } 
} 
void main() 
{ 
    int arr[10],arr2[10],i,n; 
    clrscr(); 
    printf("Enter how many elements"); 
    scanf("%d",&n); 
    for(i=0;i<n;i++) 
     scanf("%d",&arr[i]); 
    selectSort(arr,arr2,n); 
    printf("sorted list is\n"); 
    for(i=0;i<n;i++) 
     printf("%d\n",arr2[i]); 

    getch(); 
} 
+0

説明してください。 –

+0

まだ受け入れられている回答がある4歳の質問に別の回答を追加するのはなぜですか?特にあなたの新しい答えが、説明のないコードのダンプにすぎない場合は特にそうです。 – melpomene

+0

」は標準ヘッダーではありません。 'void main'は' int main'です。 'clrscr'と' getch'は標準関数ではありません。 'scanf'の戻り値を無視してはいけません(実際には、最初にユーザー入力に' scanf'を使用しないでください)。それは潜在的なバッファオーバーフローです。 – melpomene