C 为什么这种快速排序不是排序

C 为什么这种快速排序不是排序,c,arrays,structure,quicksort,C,Arrays,Structure,Quicksort,我有一个结构的哈希表。我想使用快速排序算法对存储桶的内容进行排序,下面是我尝试过的代码。结果哈希表bucket内容根本没有排序 #define BUCKETS 6000 #define BK_ENTRIES 1024 void q_sort(int,int,int); typedef struct fpinfo { char fing_print[33]; }fpinfo; q_排序法 void q_sort(int left, int right,int bk) { if(

我有一个结构的哈希表。我想使用快速排序算法对存储桶的内容进行排序,下面是我尝试过的代码。结果哈希表bucket内容根本没有排序

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

typedef struct fpinfo
{
    char fing_print[33];
}fpinfo;
q_排序法

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

我已经用c库函数qsort()解决了我的问题。但是,如果你们中的任何人还想研究这个问题,我已经按照你们的建议对其进行了更新。

我已经找到了一个解决方案。我刚刚使用了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); 
}
#包括
#包括
#定义存储桶6000
#定义BK_条目1024
int比较(常数无效*a,常数无效*b);
typedef结构fpinfo
{
无符号长偏移量;
无符号长长度;
char-fp[33];
}fpinfo;
结构fpinfo散列_表[bucket][BK_条目];
void main()
{
结构fpe;
char-fname[100];
printf(“输入源文件名\n”);
scanf(fname);
文件*htfile,*f2;
htfile=fopen(fname,“r+b”);
如果(htfile!=NULL)
{ 
fread(hash_表,sizeof(hash_表),1,htfile);
对于(intj=0;jfp,(char*)fpb->fp);
}

我找到了一个解决方案。我刚刚使用了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); 
}
#包括
#包括
#定义存储桶6000
#定义BK_条目1024
int比较(常数无效*a,常数无效*b);
typedef结构fpinfo
{
无符号长偏移量;
无符号长长度;
char-fp[33];
}fpinfo;
结构fpinfo散列_表[bucket][BK_条目];
void main()
{
结构fpe;
char-fname[100];
printf(“输入源文件名\n”);
scanf(fname);
文件*htfile,*f2;
htfile=fopen(fname,“r+b”);
如果(htfile!=NULL)
{ 
fread(hash_表,sizeof(hash_表),1,htfile);
对于(intj=0;jfp,(char*)fpb->fp);
}

了解如何使用调试器和printf()@zvrba:我确实使用了调试器,还使用printf检查了输出。但我仍然无法确定问题所在。@John,你能告诉我们调试器的输出是什么吗?它很长,很复杂,有太多的星号和方括号,大多数开发人员都看不到。就像@zvrba说的,你必须调试它。软件开发是10%的设计gn和90%调试。如果你不能调试,你就不能编程。写一堆复杂的代码,然后让这里有经验的开发人员来完成让它工作的繁重工作是呃…不友好的。提示-只需提供一个非常小的数据集,你可以在调试器中运行时“手动”跟踪它。1)我没有定义关于hash_table.2)为什么所有的强制转换?3)所有strcpy()调用的目的是什么(复制会让你感到内疚,因为有时你必须记住复制回来)?了解如何使用调试器和printf()@zvrba:我确实使用了调试器,还使用printf检查了输出。但我仍然无法确定问题所在。@John,你能告诉我们调试器的输出是什么吗?它很长,很复杂,有太多的星号和方括号,大多数开发人员都看不到。就像@zvrba说的,你必须调试它。软件开发是10%的设计gn和90%调试。如果你不能调试,你就不能编程。写一堆复杂的代码,然后让这里有经验的开发人员来完成让它工作的繁重工作是呃…不友好的。提示-只需提供一个非常小的数据集,你可以在调试器中运行时“手动”跟踪它。1)我没有定义关于hash_table.2)为什么所有的强制转换?3)所有strcpy()调用的目的是什么(复制会让你感到内疚,因为你有时必须记得复制回来)?顺便说一句:你可以在一次滑动中复制结构对象,就像
e=hash_table[j][k];
(另一种方法是
memcpy(&e,&hash_table[j][k],sizeof e);
.BTW2:如果将.fp成员的类型从unsigned char[]更改为char[]你可以省去所有丑陋的演员。BTW3:你使用的是很多括号。ByT4:你是混合C和C++习语。问题是C标记,但是你使用C和C++风格的I/O混合。@ WielpLase:你不能想象我向你们学习了多少。谢谢一百万!!!欢迎:提示:读很多代码。你可以借用一些常用的结构。我喜欢这些“我的解决方案就是不要自己写代码,而是重用一些已经可以使用的东西”的解决方案。顺便说一句:你可以在一次轻击中复制结构对象,比如
e=hash_table[j][k];
(另一种方法是
memcpy(&e,&hash_table[j][k],sizeof e);
.BTW2:如果将.fp成员的类型从unsigned char[]更改为char[]你可以省去所有丑陋的演员。BTW3:你使用的是很多括号。ByT4:你是混合C和C++习语。问题是C标记,但是你使用C和C++风格的I/O混合。@ WielpLase:你不能想象我向你们学习了多少。谢谢一百万!!!欢迎:提示:读很多代码。你可以借用一些常用的结构。我喜欢这些“我的解决方案就是不要自己写代码,而是重用一些已经有效的东西”的解决方案。
#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); 
}