1

次のような配列をアルファベット順に並べ替えたいと思います。

いろいろな方法を試しましたが、まだ方法がありません。クラッシュしますが、その理由はまだわかりません。この問題から始めるためのヒントはありますか?

私はそれほど専門家ではないので、コードは (読んだり理解したりするために) シンプルで仕事をすることを目的としています。

thx、よろしく

/* note: datalist[...] is basically the ouput from a sort of ls (dir
read) that it unsorted. So that: datalist[0] is ".." datalist[1] is
"file2.c" datalist[2] is "file34.c" and so on.*/


    char datalist[500][2024] ; 


void sortData(int aoptiondt)  {   ///////////////////////////LOCAL
DECLARATIONS/////////   int MAX = 500 ;    int current; int walker;  
int smallestIndex;   char* temp;

  ///////////////////////////DEFINITIONS//////////////////



    for (current = 0; current < MAX - 1; current++)
    {
      smallestIndex = current;
      for (walker = current; walker < MAX ; walker ++)
      {
        if (strcmp(datalist[walker], datalist[smallestIndex]) < 0)
          smallestIndex = walker;
      } //for walker

      //Swap to position smallest at what is the current position
      strncpy( temp , datalist[current] , PATH_MAX);
      strncpy( datalist[current] , datalist[smallestIndex] , PATH_MAX);
      strncpy( datalist[smallestIndex] , temp, PATH_MAX);
    } //for current    }

  return; }


//blabla
    int  main() {



    }
4

3 に答える 3

2

いつものように -qsortあなたの親友です:

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 6
#define STRING_SIZE 4
#define STRINGS "eed", "abd", "cde", "abc", "acd", "ade"

char strUnsorted[][STRING_SIZE] = {STRINGS};
char strSorted[][STRING_SIZE]   = {STRINGS};

int compare (const void * a, const void * b) {
  return strcmp(a, b);
}

int main () {

  qsort(strSorted, LENGTH, STRING_SIZE, compare);

  printf("Unsorted | Sorted\n");
  printf("-----------------\n");

  int i;
  for (i=0; i < LENGTH; i++)
    printf ("  %s    |   %s\n", strUnsorted[i] ,strSorted[i]);

  return 0;
}
于 2013-02-20T08:33:43.087 に答える
1

文字の配列だけでなく、文字配列の配列も必要です。C の場合と同様に、メモリ管理に注意し、割り当てられた配列の境界を維持する必要があります。私の解決策については、以下を参照してください。単純な選択ソート アルゴリズムを使用しましたが、このようなアプリケーションでは完全に機能します。方法は次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 5
#define MAX_STRLEN 80

void sort(char **a, int n);
char *stringArray[N];

int main(int argc, char *argv[]) 
{
   int i;

   printf("\nEnter %d names, one per line:\n",N);
   for (i = 0; i < N; i++) 
   {
      stringArray[i] = (char *)malloc(MAX_STRLEN);
      strcpy(stringArray[i],"");
      printf("> ");
      fgets(stringArray[i],MAX_STRLEN,stdin);
      *strchr(stringArray[i],'\n') = '\0';
   }
   sort(stringArray,N);
   printf("\nSorted:\n");
   for (i = 0; i < N; i++) 
   {
      puts(stringArray[i]);
      free(stringArray[i]);
   }

   return 0;
}

/* selection sort */
void sort(char **a, int n) 
{
   int min,i,j;
   char t[MAX_STRLEN];

   for (i = 0; i < n; i++) 
   {
      min = i;
      for (j = i+1; j < n; j++) 
      {
        if (strcmp(a[j],a[min]) < 0) 
          min = j;
      }
      strcpy(t,a[min]);
      strcpy(a[min],a[i]);
      strcpy(a[i],t);
   }
}
于 2013-02-20T08:03:42.993 に答える
-1

http://www.asciitable.com/index/asciifull.gifここにASCIIテーブルがあります。これを見ると、キャラクターが並べ替えられているのがわかります。つまり、charをintにキャストしてそのASCII番号を取得し、この番号を使用してそれらを並べ替えることができます。

サンプル:

  int len =strlen(word);
  int wordWeight=0;
  for(int i=0;i<len;i++)
  {
      wordWeight+=(int)word[i];
      wordWeight*=1000;
  }

wordWeightを使用すると、それらを並べ替えることができます。注:ASCII値は0から255の間で変化するため、ASCII値を1000に乗算していますが、一部の単語が大文字で始まり、他の単語が小文字で始まる場合は問題が発生します。しかし、私はあなたがそれを扱うことができると思います

于 2013-02-20T08:07:05.097 に答える