我有一个结构哈希表。我想使用快速排序算法对存储桶的内容进行排序,这是我尝试过的代码。结果哈希表桶内容根本没有排序。
#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);
}
您可能会说代码太长但我无法缩短代码。
编辑:
以下是 hash_table
的声明struct fpinfo hash_table[BUCKETS][BK_ENTRIES];
我用c库函数qsort()解决了我的问题。但是,如果您仍然想要查看此问题,我已将其更新为您的建议。
答案 0 :(得分:1)
我有一个解决方案。我刚刚使用了 qsort()标准C函数。我已经包含了所有的源代码,所以像我这样的初学者都可以更好地理解它。
编辑为 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);
}