这种排序功能如何工作?

前端之家收集整理的这篇文章主要介绍了这种排序功能如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
作为我工作的一部分,我偶尔会被要求评估编程职位的候选人.我最近在我的办公桌上传递了一段代码片段,我的第一个想法是我不确定这样的代码是否会再编译.但编译它确实如此,它也可以.

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

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-swap技巧以内联方式表示.我用几个不同的选项编译它,希望它产生一些很棒的紧凑代码,但它真的不那么令人印象深刻.我抛出了一些__restrict__关键字,这样编译器就会知道* a中没有一个可以互为别名,这确实有点帮助.总的来说,我认为尝试的聪明已经远远超出了规范,编译器实际上根本没有很好地优化代码.

我认为这里唯一的优点是新颖性.它确实引起了你的注意!我会对滥用更多现代技术印象更深刻,例如使用MMX / SSE或GPU进行排序,或者使用5个线程来解决它以试图将其元素插入到正确的位置.或者也许是外部合并排序,以防万一5元素数组不适合核心.

原文链接:https://www.f2er.com/c/115120.html

猜你在找的C&C++相关文章