c - 这个排序函数是如何工作的?

标签 c sorting readability

作为我工作的一部分,我偶尔会被要求评估编程职位的候选人。一段代码最近从我的办公 table 上经过,我的第一个想法是我不确定这样的代码是否还能编译。但编译它确实如此,而且它也能正常工作。

谁能解释为什么以及如何工作?任务是提供一个函数来对五个整数值进行排序。

void order5(arr) int *arr; {
    int i,*a,*b,*c,*d,*e;
    a=arr,b=arr+1,c=arr+2,d=arr+3,e=arr+4;
    L1: if(*a >*b){*a^=*b;*b^=*a;*a^=*b;}
    L2: if(*b >*c){*b^=*c;*c^=*b;*b^=*c;goto L1;}
    L3: if(*c >*d){*c^=*d;*d^=*c;*c^=*d;goto L2;}
        if(*d >*e){*d^=*e;*e^=*d;*d^=*e;goto L3;}
}

现在我可以看到这种方法的缺点(对于 1970 年之后出生的人来说缺乏可读性和可维护性)但是有人能想到任何优点吗?我很犹豫是否立即将其驳回,但在我们决定是否让这个人回到第 2 轮之前,我想知道它是否有任何超越作者工作保障的补偿功能。

最佳答案

这是一个完全展开的冒泡排序,具有内联表示的 XOR 交换技巧。我用几个不同的选项编译了它,希望它产生一些很棒的紧凑代码,但它真的没有那么令人印象深刻。我加入了一些 __restrict__ 关键字,这样编译器就会知道 *a 中的任何一个都不能互相使用别名,这确实有很大帮助。不过总的来说,我认为尝试的聪明已经远远超出了规范,以至于编译器实际上根本没有很好地优化代码。

我认为这里唯一的优势就是新颖。它肯定引起了你的注意!我会对更多现代技术的滥用印象更深刻,例如使用 MMX/SSE 或 GPU 进行排序,或者使用 5 个线程,它们都在努力将元素插入正确的位置。或者可能是外部合并排序,以防 5 元素数组无法放入核心。

关于c - 这个排序函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084897/

相关文章:

sorting - Elasticsearch组排序组合查询

c++ - 制作一个用指针排序的有效算法

java - 引入变量只是为了可读性?

c - 如何在每次程序运行时从空指针取消引用中崩溃?

c - 通过命令行获取一个十六进制数到程序中

javascript - 按另一个对象对对象(字符串)进行排序

Python 或 R 的可读性

c# - 是否有使用查询语法在 LINQ 查询中执行 ToList 的巧妙方法?

c - 有人可以告诉我我的错误吗?

c - 使用套接字的 lpNumberOfBytesRead 和 lpNumberOfBytesWritten