0

選択ソートとポインターを使用して構造体の配列をソートしようとしていますが、問題が発生しています。

配列を出力して名前が並べ替えられているかどうかを確認しようとすると、最初の位置にある名前(並べ替えられていない)を除いて、すべての名前が並べ替えられます。

/*
   all is the unordered array of struct; pLast is pointer to the last struct in array.
*/
void sortArray(CASE* all, CASE* pLast)
{
  CASE* current;
  CASE* walker;
  CASE* smallest;
  CASE temp;


  for(current = all; current < pLast; current++)
  {
    smallest = current;

    for (walker = current + 1; walker <= pLast; walker++)
    {
      if(strcmp(walker->name, smallest->name) < 0 )
        smallest = walker;
    }
    temp = *current;
    *current = *smallest;
    *smallest = temp;
  }

  for(walker = all; walker <= pLast; walker++)
  {
    printf("%s\n", walker->name);
  }  

  return;
}

任意のヒント?

ありがとう

編集:名前を印刷できるが完全にはソートされないメジャーリビジョン

4

2 に答える 2

2

単純なアルゴリズムであるため、選択ソートは常に次のようになります。

function selection_sort(arr):
  for i in 0..len(arr)-1:
    smallest = i
    for j in i+1..len(arr)-1:
      if arr[j] < arr[smallest]:
        smallest = j
    swap i and smallest.

ポインタを使用する場合、実装は引き続きこの形式(または非常に近い)を使用します。

参考:http ://en.wikipedia.org/wiki/Selection_sort

于 2012-04-24T05:50:38.403 に答える
0

qsortを使用しない理由はありますか?

残念ながら、あなたは何struct CASE*であるかを書かないでください。フィールド名が含まれていることがわかります

したがって、次のような比較関数を記述できます。

int case_struct_comparison_function (const void * v1, const void * v2) {
  const struct CASE * case_1 = v1;
  const struct CASE * case_2 = v2;
  return  strcmp(case_1->name, case_2->name);
}

qsort(arr, size_of_arr, sizeof(struct CASE), case_struct_comparison_function);

それはテストされていませんが、あなたにアイデアを与えるはずです。

于 2012-04-24T05:40:51.507 に答える