2016-12-09 11 views
0

コード:バブルソート:関数配列データを変更しない

#include <stdio.h> 

void testSort(int values[], int n); 

int main(void) 
{ 
    int hs[] = {5,3,2,1,4}; 
    printf("Unsorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]); 
    testSort(hs, 5); 

    printf("Sorted: %i %i %i %i %i\n", hs[0], hs[1], hs[2], hs[3], hs[4]); 
} 

void testSort(int values[], int n) 
{ 
    for (int i = 0; i < n-1; i++) 
    { 
     int hold; 
     int current = values[i]; 
     int next = values[i + 1]; 

     if (current > next) 
     { 
      hold = current; 
      current = next; 
      next = hold; 
     } 
    } 
    return; 
} 

私はバブルソートをやろうとしていると、今一度配列を通過するが、私の質問です:なぜ私ではありませんhs[]関数呼び出し後の更新?第2のprintfは、それが同じままであることを示しています。

EDIT: 述べたように、私データを変更することなく、コピーのが判明しました。私は、変数を作成したとき、彼らはvalues[i]/values[i+1]表現されたが、現実には、私はちょうど新しい変数を作成し、5とcurrentに割り当てるあるvalues[0]を渡したかのように何らかの理由で私はcurrent/next私は感じました。明らかに値[]を変更しないままにする。みんなありがとう

+1

'values [i]'と 'values [i + 1] 'を入れ替える必要があります。すべてのコードは、コピーを 'current'と' next'に入れ替えています。 – user3386109

+1

あなたの関数は 'values [i]'をどこでも変更しません。 – melpomene

+0

@Fang配列を値渡しすることはできません。配列は最初の要素へのポインタになります。 – Quentin

答えて

2

問題は、あなただけの関数のローカル変数ではなく、配列の要素を変更していることです。

それは、このプログラムは1なく2を印刷します、なぜ同じ原理です:

int main() 
{ 
    int array[] = {1}; 
    int x = array[0]; 
    x = 2; 
    printf("array[0] = %d\n", array[0]); 
    return 0; 
} 

あなたは、配列の要素に値を代入する必要があります。

void testSort(int values[], int n) 
{ 
    for (int i = 0; i < n-1; i++) 
    { 
     if (values[i] > values[i+1]) 
     { 
      int hold = values[i]; 
      values[i] = values[i+1]; 
      values[i+1] = hold; 
     } 
    } 
} 

あなたがこれを修正したら、この機能は一部の入力に対してのみ機能することに気づくでしょう。
このバグを解決することは練習問題として残されています。

0

はコードの下に試してください: -

void bubble_sort(int list[], int n){ 
     int c, d, t; 
     for (c = 0 ; c < (n - 1); c++) 
     { 
     for (d = 0 ; d < n - c - 1; d++) 
      { 
      if (list[d] > list[d+1]) 
      { 
       t   = list[d]; 
       list[d] = list[d+1]; 
       list[d+1] = t; 
      } 
      } 
    } 
} 
+0

ここで少し説明すると助かります。 –

+0

最初にこのコードを試してチェックし、それが仕事かどうかを確認します。それでは説明します –

+0

@SarikaKoli:いいえ、ナンセンスです。コードを変更するための提案をしているので、他の誰かが解決策が正しいことを確認した後ではなく、すぐに説明してください。実際にコードをテストするかどうかは問題ではありません。 –

関連する問題