Tag: qsort

QSorting malloc’d结构数组?

我在C中的qsort有这个比较器function,但无论我尝试什么,我似乎都会遇到分段错误… int textCompare ( const void * a, const void * b ){ const char **x =(const char**)a; const char **y =(const char**)b; return strcmp(*x, *y); } 这是我的qsort调用:其中message** mList = malloc(INITIAL_CAPACITY * sizeof(message)); 和count是一个整数,跟踪最后一个元素。 message只是一个typedef结构,包含一个int和一个指向char的指针。 我67%肯定我正确地调用了qsort,有人能指出我正确的方向吗? qsort (*mList, count, sizeof(message), textCompare); [编辑]我声明消息***而不是消息*的原因是因为我正在尝试初始化指向结构的指针“数组”; 除非我以错误的方式解决这个问题?

排序2个大型数组

我还没有采用数据结构和算法类,我在尝试做的事情上遇到了一些麻烦。 我有2个大数组,1个是大约80k-100k字的char ,第二个是具有相同整数量的int数组(例如,用words[502]写的words[502]其出现的数量用integers[502]写成integers[502] )。 我必须对它们进行排序,以便它的相应单词的最大整数是第一个,第二个第二个等等,是否可以不使用冒泡排序(这对于这些数字来说太慢)? void bubble_sort(int n) { int i,j,temp; char tempwordy[40]={0}; for(i=1;i< n;i++) { for(j=0;jcounters[j+1]) { temp=counters[j]; counters[j]=counters[j+1]; counters[j+1]=temp; strcpy(tempwordy,words[j]); strcpy(words[j],words[j+1]); strcpy(words[j+1],tempwordy); } } } }

如何在C中对非常大的数组进行排序

我想在C中排序四百万long long s。通常我只是malloc()一个缓冲区用作数组并调用qsort()但是四百万* 8字节是一大块连续内存。 最简单的方法是什么? 为此,我对速度感到轻松。 我不想使用任何库,结果将需要在Windows和Linux下的适度上网本上运行。

了解qsort()函数

int compare (const void * a, const void * b) { return ( (int) (*(float*)a – *(float*)b) ); } 当我想使用qsort函数时,我应该按照我的理解以这种forms编写一个比较函数。 那么,为什么我们在比较函数的参数之前使用void呢? 并且,这是比较function标准及其参数和花括号中的代码,还是我们可以通过我们的愿望简单地更改代码甚至参数?

使用qsort和printf时出现分段错误

我正在尝试通过搜索md5哈希文件并使用bsearch在rockou数据库中找到它们来制作破解密码的程序。 我的问题是我遇到了由我的qsort或我的printf引起的分段错误(我运行Valgrind并且它说printf,但是操纵qsort会改变错误输出)。 我似乎无法在线找到解决方案,虽然我已经尝试刷新stdout以及在qsort函数中调整数组大小的不同方法。 char **dict = read_dict( argv[2] ); read_dict,我没有放在这里,因为它是一大堆代码,接受字典文件,将其拆分为字符串数组,将其格式化为hash:password,并为其设置mallocs空间。 然后它返回包含每个字符串的指针数组的指针。 int qcompare( const void *a, const void *b) { return strncmp( *((char **)a), *((char **)b), HASH_LEN); } qsort(dict, (sizeof(dict) / sizeof(dict[0])), sizeof(char *), qcompare); for (int i = 0; dict[i] != NULL; i++) { printf(“%s\n”, dict[i]); } 这里显示的printf不是我正在使用的那个,它只是我试图用来调试我的代码的一个更简单的。 这是我第一次发帖,所以希望我没有做任何格式化这个问题的错误。 提前感谢您提供的任何帮助。 read_dict按要求 char **read_dict(char *filename) […]

Qsort基于c-string中的列?

类项目涉及对字符串数组进行排序,每个字符串包含相同数量的列,如下所示: Cartwright Wendy 93 Williamson Mark 81 Thompson Mark 100 Anderson John 76 Turner Dennis 56 程序接受要对其进行排序的列的命令行参数,并且应该打印出未修改的已排序字符串。 我想使用strtok将每个字符串的副本分成列,并为每一行创建结构,如下所示: struct line { char * line; char column_to_sort_on[MAX_COLUMN]; } 我的问题是qsort作为arg的比较函数指针。 如果我理解正确,比较函数必须带两个const void指针指向要排序的项 ,并返回一个int。 这意味着我无法将指向结构的指针传递给比较函数,因为这不是qsort将要排序的内容。 我无法传入列号来排序比较函数,因为它只能取两个参数。 如何根据特定列对这些字符串进行排序? 编辑:如果我真的想要,排序仅限于qsort或我自己。 给出选择,我选择qsort。 🙂 编辑#2:共识似乎是使用列号的全局变量,或者只是使用qsort对结构数组进行排序。 我没有想过只是对结构进行排序,并使用其中的指针打印出原始字符串。 我想这就是我要做的。 谢谢大家的帮助!

qSort not Sorting my array

这是我的代码: #include #include float comp (const void * elem1, const void * elem2) { float f = *((float*)elem1); float s = *((float*)elem2); if (f > s) return 1; if (f < s) return -1; return 0; } int main(void) { int t, n, temp, temp1, x; float input[2][50][1000]; scanf("%d", &t); for(temp=0; temp<t; temp++){ scanf("%d ", […]

基于第一列排序二维数组

我有一个temp2.dat文件: 0.060493 1 0.5 1 1.596961 0 0.1 2 0.87758 1 0.3 1.5 0.165453 1 0 3 0.07085 1 0.3 4 0.125379 1 0.2 3 0.454202 1 0.2 2 0.373227 1 0.3 1 0.131486 1 0.3 3 0.867477 0 0.5 4 0.122609 0 0.8 9 现在我想在C编写函数,以递增的顺序对这4列进行排序,但仅基于第一列的值。 我尝试修改以下代码但失败了: struct data_t { double x; int y; double […]

使用qsort对2D数组进行排序

我正在尝试排序2d数组。 首先,我按列排序,然后按行排序。 逐列工作但不是逐行。 这段代码有什么问题? int scmpr (const void *a, const void *b){ return strcmp((const char*)a, (const char*)b); } int main(void){ int i,j; char **tab; tab=(char**)malloc(sizeof(char*)* 10); for(i=0; i<10; i++){ tab[i]=(char*)malloc(sizeof(char)*15); } for(i=0; i<10; i++){ for(j=0; j<15; j++){ tab[i][j]=rand()%20+'b'; printf("%c ", tab[i][j]); } puts(""); } for (i = 0; i<10; i++){ qsort(&tab[i][0], 15, sizeof(char), scmpr); } […]

我的Qsort比较函数在内存中引起奇怪的东西

为了习惯动态创建二维数组,我想创建一个可以按每个数组中的第五个成员排序的数组。 该数组是一组双打的多维数组。 每组持有五个双打。 最后两个双打是根据我写的一些随机表达式基于前三个计算的。 数组与从文件中读取的双打组数一样多。 当我写这篇文章的时候,我得到了非常随机的结果。 #include #include #include #include int getAllDoubles(char *, double ***); void printDouble(int, int, double **, char); int doubleCmp(const void *, const void *); int main(){ double **arrayAll; char *fileName = “doubles.dat”; int doublesCount = getAllDoubles(fileName, &arrayAll); printf(“%d doubles successfully copied\n”, doublesCount); printf(“As a sample, here’s #161\n”); printDouble(161, doublesCount, arrayAll, ‘a’); […]