2012-03-21 2 views
1

У меня есть хеш-таблица структур. Я хотел сортировать содержимое ведер, используя быстрый алгоритм сортировки, и вот код, который я попробовал. Результат hash table bucket content не сортируется вообще.Почему этот быстрый сортировка не сортируется

#define BUCKETS 6000 
#define BK_ENTRIES 1024 
void q_sort(int,int,int); 

typedef struct fpinfo 
{ 
    char fing_print[33]; 
}fpinfo; 

метод q_sort

void q_sort(int left, int right,int bk) 
{ 
    if(left>=right) 
     return ; 
    char l_hold[33], r_hold[33]; 
    int pivot=left; 
    l_hold=hash_table[bk][left].fp; 
    r_hold=hash_table[bk][right].fp; 
    hash_table[bk][pivot].fp=hash_table[bk][left].fp; 
    while (left < right) 
    { 
     while ((strcmp(hash_table[bk][right].fp,hash_table[bk][pivot].fp)>=0) && (left < right)) 
      right--; 

     if (left != right) 
     { 
      hash_table[bk][left].fp=hash_table[bk][right].fp; 
      left++; 
     } 
     while ((strcmp(hash_table[bk][left].fp,hash_table[bk][pivot].fp)<=0) && (left < right)) 
      right--; 

     if (left != right) 
     { 
      hash_table[bk][right].fp= hash_table[bk][left].fp; 
      left++; 
     } 

    } 
    hash_table[bk][left].fp=hash_table[bk][pivot].fp; 
    hash_table[bk][pivot].fp=hash_table[bk][left].fp; 
    hash_table[bk][left].fp=l_hold; 
    hash_table[bk][right].fp=r_hold; 

    if ((strcmp(hash_table[bk][left].fp,hash_table[bk][pivot].fp)<=0)) 
     q_sort(left, pivot-1,bk); 
    if ((strcmp(hash_table[bk][right].fp,hash_table[bk][pivot].fp)>0)) 
     q_sort(pivot+1, right,bk); 
} 

Вот как я назвал его в главном

fread(hash_table,sizeof(hash_table),1,htfile); 


for(int j=0;j<BUCKETS;++j) 
{ 

    q_sort(0,BK_ENTRIES-1,j); 
} 

Вы могли бы сказать, что код слишком долго, но я не мог сделать это любой короче.

EDIT:

Вот декларация hash_table

struct fpinfo hash_table[BUCKETS][BK_ENTRIES]; 

я решил мою проблему с помощью функции с библиотекой QSort(). Но в случае, если кто-то из вас хочет по-прежнему изучать эту проблему, я обновил ее в качестве ваших предложений.

+4

Узнайте, как использовать отладчик и Е(). – zvrba

+0

@zvrba: Я использовал отладчик и также проверял вывод с помощью printf. Тем не менее я не мог определить проблему. – John

+0

@John, можете ли вы рассказать нам, что такое вывод отладчика? –

ответ

1

У меня есть решение. Я просто использовал стандартную функцию Cs qsort(). Я включил весь исходный код, чтобы все новички, как я, могли лучше понять его.

редактироваться wildplasser-х РЕКОМЕНДУЕМЫЙ:

#include<iostream> 
#include<stdio.h> 

#define BUCKETS 6000 
#define BK_ENTRIES 1024 

int compare (const void * a, const void * b); 
typedef struct fpinfo 
{ 
    unsigned long long offset; 
    unsigned long length; 
    char fp[33]; 

}fpinfo; 
struct fpinfo hash_table[BUCKETS][BK_ENTRIES]; 
void main() 
{ 
    struct fpinfo e; 
    char fname[100]; 
    printf("Enter source file name\n"); 
    scanf(fname); 
    FILE *htfile,*f2; 
    htfile=fopen(fname,"r+b"); 

    if (htfile != NULL) 
     { 
       fread(hash_table,sizeof(hash_table),1,htfile); 
      for(int j=0;j<BUCKETS;++j) 
      { 
       qsort(hash_table[j],BK_ENTRIES,sizeof(e),compare); 
      } 
    } 
    else 
    { 
     printf("Couldn't open source file"); 
     exit(1); 
    } 
    f2=fopen("dest.txt","w+b"); 
    if (f2 != NULL) 
    {       
     fwrite(hash_table,sizeof(hash_table),1,f2); 
    } 
    else 
    { 
     printf("Couldn't open destination file"); 
     exit(1); 
    } 
      fclose(htfile); 

      fclose(f2); 

} 
int compare (const void * a, const void * b) 
{ 
    struct fpinfo *fpa=(struct fpinfo*)a; 
    struct fpinfo *fpb=(struct fpinfo*)b; 
    return strcmp((char*)fpa->fp,(char*)fpb->fp); 
} 
+0

BTW: вы можете скопировать объекты структуры буквально одним ударом, например 'e = hash_table [j] [k];' (другим способом будет 'memcpy (& e, & hash_table [j] [k], sizeof e);'. BTW2: если вы измените тип члена .fp из unsigned char [] на char [], вы можете опустить все уродливые приведения. BTW3: вы используете слишком много круглых скобок. BTW4: вы смешиваете идиомы C и C++. – wildplasser

+0

вопрос помечен C, но вы используете сочетание ввода/вывода типа C и C++. – dreamlax

+0

@wildplasser: вы не можете себе представить, насколько я учусь от вас, ребята. Спасибо миллион !!!! – John

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

  • Нет связанных вопросов^_^