2013-02-20 2 views
1

Я хотел бы отсортировать массив по алфавиту, который выглядит так:Сортировка массива в алфавитном порядке на языке программирования C?

Я пробовал различные методы, но все равно никак. он падает, и не знаю, почему. У вас есть несколько советов, чтобы начать с этой проблемы?

С тех пор я не настолько эксперт, код нацелен на то, чтобы быть простым (читать/понимать) и выполнять работу.

ТНХ, С уважением

/* 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() { 



    } 
+2

Ну это выглядит как 'main' и массив' datalist', не более того. Нет никаких следов ваших различных методов. –

+0

Добро пожаловать в Stackoverflow. Мы будем рады помочь вам, если вы поделитесь своим кодом и зададите ему вопросы. –

+2

читать 'man qsort' –

ответ

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); 
    } 
} 
+0

+1 для усилий, однако, функции сортировки домашних браков должны выполняться только для практики, но не для практического использования. –

+0

thx. Это действительно не так просто понять этот предлагаемый код. Я все еще пытаюсь понять, как это может/может работать. ... Надеюсь, это может сработать. (?) – user2046229

-1

http://www.asciitable.com/index/asciifull.gif вот таблица ascii. если вы посмотрите на это, вы увидите, что персонаж приходит в роде. этот meanyou может наложить char на int и получить его номер ascii, тогда вы можете использовать этот номер для сортировки.

Образец:

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

с помощью wordWeight Youcan сортировать их. ПРИМЕЧАНИЕ: мы умножаем значения ascii на 1000, потому что значения ascii изменяются между 0 и 255, но у вас будет проблема, если некоторые слова начинаются с прописных букв, а другие начинают любовницу. Но я думаю, что вы можете справиться с этим

+0

-1: сортировка целых чисел не проще, чем сортировка строк. Кроме того, вы столкнетесь с ошибками переполнения. –

+0

Общий комментарий: ошибка переполнения на самом деле является основным риском для всех этих операций сортировки. Поэтому он должен строго переносить константу управления памятью. Поскольку БД (база данных) может быть большой (ну, только [500] [1024]), память имеет большое значение. – user2046229

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; 
} 
+0

Я думаю, что ваша функция сравнения неверна. qsort передает указатель на места в массиве для сравнения, поэтому a и b на самом деле имеют тип 'char * const *' –

+0

'const void *' будет передаваться в 'const char *' в [strcmp] (http: // www.cplusplus.com/reference/cstring/strcmp/). Так что все в порядке. –

+0

нет, это не так. потому что параметры в основном char ** not char * :) –

Смежные вопросы