Tag: 排序

如何在C中对argv的元素进行排序?

我试图按字母顺序排序argv的元素。 以下代码行给了我一些问题: qsort(argv[optind], argc – optind, sizeof(argv[optind]), sort); 具体来说,最后一个参数给我带来了麻烦,即比较函数,如下所示: int sort(const void *a, const void * b) { return(strcmp( (char*)a, (char*)b )); } 目前,它编译得很好,但是当我运行它时,我最终得到了一个分段错误。

比较数字然后得到中值

使用按位或比较运算符对五个整数进行排序可以通过首先得到最高数,然后是第二高,然后是第三个来实现,依此类推。 以下是获取最高编号的代码: #include int main() { int a, b, c, d, e; int aa, bb, cc, dd, ee; a = 4; b = 2; c = 5; d = 1; e = 3; aa = (a > b) ? ((a > c) ? ((a > d) ? ((a > e) ? a : e) : […]

数百万UINT64 RGBZ图形像素的最快排序算法

我正在使用来自.RAW文件的RGB数据对1000多万uint64_t排序,并且在qsort花费了79%的C程序时间。 我正在寻找这种特定数据类型的更快排序。 作为RAW图形数据,这些数字非常随机,大约80%是唯一的。 不需要对排序数据进行部分排序或运行。 uint64_t内的4 uint16_t s是R,G,B和零(可能是一个小的计数<= ~20)。 我有最简单的比较函数,我可以想到使用unsigned long long (你不能只减去它们): qsort(hpidx, num_pix, sizeof(uint64_t), comp_uint64); … int comp_uint64(const void *a, const void *b) { if(*((uint64_t *)a) > *((uint64_t *)b)) return(+1); if(*((uint64_t *)a) < *((uint64_t *)b)) return(-1); return(0); } // End Comp_uint64(). StackExchange上有一个非常有趣的“Programming Puzzles&Code Golf”,但是他们使用了float 。 然后有QSort,RecQuick,堆,stooge,树,基数…… swenson / sort看起来很有趣,但对我的数据类型uint64_t没有(明显的)支持。 而“快速排序”时间是最好的。 有些消息称,系统qsort可以是任何东西,不一定是“快速排序”。 C ++排序绕过了void指针的通用转换,并实现了对C的性能的极大改进。必须有一种优化的方法,以经线速度通过64位处理器猛击U8。 系统/编译器信息: […]

c栈中的递归

这里是在merge merge中进行分区的代码。我无法理解recusrion究竟是如何工作的! MERGE SORT PARTITION void partition(int arr[], int low, int high){ int mid; if(low < high){ mid = (low + high)/2; partition(arr, low, mid); partition(arr, mid + 1, high); mergeSort(arr, low, mid, high); } } 实际上我在很多递归问题中搞砸了,我无法理解系统堆栈如何在递归中工作……我是一个初学者..

qsort使用什么排序算法?

我找不到有关C qsort函数使用的排序算法的任何信息。 它快速排序吗? 人类没有提到它。

如何从stdlib为qsort编写比较函数?

我有一个结构: struct pkt_ { double x; double y; double alfa; double r_kw; }; typedef struct pkt_ pkt; 这些结构的表格: pkt *tab_pkt; tab_pkt = malloc(ilosc_pkt * sizeof(pkt)); 我想要做的是通过tab_pkt.alfa和tab_pkt.r对tab_pkt进行排序: qsort(tab_pkt, ilosc_pkt, sizeof(pkt), porownaj); porownaj是比较函数,但如何写呢? 这是我的“草图”: int porownaj(const void *pkt_a, const void *pkt_b) { if (pkt_a.alfa > pkt_b.alfa && pkt_a.r_kw > pkt_b.r_kw) return 1; if (pkt_a.alfa == pkt_b.alfa && […]

冒泡在C中排序

我试图在C中实现冒泡排序并且已经到了这么远,但它还没有正确排序。 #include int main() { int n, i, j, a[5], b, temp; printf(“Enter the number of elements to be sorted\n”); scanf(“%d”, &n); for(i = 0; i < n; ++i) { printf("%d – Enter the elements – ", i); scanf("%d", &a[i]); } for(i = 0; i < n; ++i) { for(j = 0; j a[i+1]) { […]

拼图:在一个解析中对0和1的数组进行排序。

是否可以在一个解析中按顺序排列仅由1和0组成的数组而不使用辅助数组? 例如:假设你有一个数组a[]={1,0,0,0,1,0,1} ,为此预期的输出将是a[]={1,1,1,0,0,0,0} 。 我编写了下面的C代码,但它在2个解析中找到了解决方案。 可以优化吗? void arrange(int a[],int n) { int i,count=0; for(i=0;i<n;i++) { if(a[i]==1) count++; a[i]=0; } for(i=0;i<count;i++) { a[i]=1; } }

qsort是否要求进行一致的比较,还是可以将其用于改组?

更新 :请在糟糕的想法下提交。 生活中没有任何免费的东西,这肯定是证据。 一个简单的想法变坏了。 然而,这绝对是值得学习的东西。 懒惰的编程挑战。 如果我传递一个50-50为qsort的比较函数返回true或false的函数,我认为我可以有效地取消编写3行代码的结构数组。 int main ( int argc, char **argv) { srand( time(NULL) ); /* 1 */ … /* qsort(….) */ /* 2 */ } … int comp_nums(const int *num1, const int *num2) { float frand = (float) (rand()) / ((float) (RAND_MAX+1.0)); /* 3 */ if (frand >= 0.5f) return GREATER_THAN; […]

标准排序网络,用于n的小值

我正在寻找一个5元素排序的排序网络实现,但由于我在SO上找不到好的参考,我想要求为所有小的n值排序网络,至少n = 3通过n = 6但更高的值也会很大。 一个好的答案至少应该将它们列为“交换”(在2个元素上排序)操作的序列,但是在低阶排序网络方面看到递归分解也可能会很好。 对于我的应用程序,我实际上只关心5个元素的中位数,而不是实际按顺序排列。 也就是说,只要中位数在正确的位置结束,结果中可能未指定其他4个元素的顺序。 可以使用与排序网络相关的方法来计算交换数量少于执行完整排序的中位数吗? 如果是这样,我的问题(对于n = 5)和其他情况的这种解决方案也会得到一个很好的答案。 (注意:我已经标记了这个问题C,因为C是我使用的语言,我怀疑跟随C标签的人有很好的答案,但我真的不在乎答案实际上是用C语言编写而不是伪代码只要符合上述标准,它就可以很容易地转换为C语言。)