2016-09-26 19 views
1

配列の添字の代わりにポインタを使って配列を最小から最大までソートしようとしています。私は問題がどこにあるのかわかりませんが、このコードを実行すると、値は入力されたのと同じ順序で返されます。 find_largest関数とswap関数はどちらも、まさにそのことを示しています。 selection_sort関数は、forループを使用して右から左(最大から最小、右から左)の数値をソートします。私はこれをしばらく見据えていますが、うまくいくはずですが、私が言ったように何らかの理由で数字が入力されたのと同じ順番で返されます。 は、ここに私のコードです:ポインタを使ってcで配列を並べ替える

#include <stdio.h> 

#define N 5        

void selection_sort(int *a, int n); 
int *find_largest(int *a, int n); 
void swap(int *p, int *q); 

int main(void) 
{ 
    int i; 
    int a[N]; 

    printf("Enter %d numbers to be sorted: ", N); 
    for (i = 0; i < N; i++) 
    scanf("%d", (a+i)); 

    selection_sort(a, N); 

    printf("In sorted order:"); 
    for (i = 0; i < N; i++) 
    printf(" %d", *(a+i)); 
    printf("\n"); 

    return 0; 
} 

void selection_sort(int *a, int n) 
{ 
     int i = 0; 
     int *largest; 

     for(i = 0; i < n; i++){ 
       largest = find_largest(a, n-i); 
       swap(largest, a+(n-1-i)); 
     } 

} 

int *find_largest(int *a, int n){ 
     int *p = a; 
     int *largest = p; 
     for(p = a; p < a+n-1; p++){ 
       if(*(p+1) > *p){ 
         largest = (p + 1); 
       } 
     } 
     return largest; 
} 


void swap(int *p, int *q){ 
     int *temp; 
     temp = p; 
     p = q; 
     q = temp; 
} 
+3

、あなたの 'スワップ()'関数は、* *それが言う何をしません。 。最初に、関数の引数の値を入れ替えても、関数の外では何の効果もありません。ただし、重要なのは、スワップするポインタではなく、ポインタが指す値です。 –

+0

[固定コード](http://ideone.com/GcM14V) – BLUEPIXY

+0

'swap'では、実際には' int temp; 'が必要です。その後、残りのコードを修正します。 – jxh

答えて

2

コードに間違いが2つあります。

int *find_largest(int *a, int n){ 
    int *p = a; 
    int *largest = p; 
    for(p = a; p < a+n-1; p++){ 
      if(*(p+1) > *largest){  <---- //here you were checking for *(p) 
        largest = (p + 1); 
      } 
    } 
    return largest; 

} 

他スワップ機能のポインタである:find_largest関数の論理 一つ、逆に

void swap(int *p, int *q){ 
    int temp; 
    temp = *p; 
    *p = *q; 
    *q = temp; 
} 
0

ジョン・ボリンジャーはコメントで述べたように、スワップ()は正しく機能しません - それがないすべてはすぐにスコープの外に出る再割り当てのポインタです。 ここでは動作する関数の書き換えです。それを入れ替えるだけで完璧にフィットします。

void swap(int *p, int *q){ 
     int temp; 
     temp = *p; 
     *p = *q; 
     *q = temp; 
} 

John Bollingerに感謝します。

関連する問題