почему эта быстрая сортировка не сортирует - PullRequest
1 голос
/ 21 марта 2012

У меня есть хеш-таблица структур.Я хотел отсортировать содержимое блоков, используя алгоритм быстрой сортировки, и вот код, который я попробовал.Содержимое корзины хеш-таблицы результата вообще не сортируется.

#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);
}

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

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


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

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

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

РЕДАКТИРОВАТЬ:

Вот объявление hash_table

struct fpinfo hash_table[BUCKETS][BK_ENTRIES];

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

1 Ответ

1 голос
/ 21 марта 2012

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

ИЗМЕНЕНО КАК Wildplasser's ПРЕДЛАГАЕТСЯ:

#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); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...