C# 无分支排序3个数字 在C++或C++中,如何实现三(整数)的无分支排序? 这是可能的吗?< /P> < P>你可以在C++中用: #include <iostream> void sort(int *in) { const int sum = in[0]+in[1]; const int diff = abs(in[1]-in[0]); in[0] = (sum + diff) / 2; in[1] = (sum - diff) / 2; } int main() { int a[] = {3,4,1}; sort(a); sort(a+1); sort(a); std::cout << a[0] << "," << a[1] << "," << a[2] << std::endl; int b[] = {1,2,3}; sort(b); sort(b+1); sort(b); std::cout << b[0] << "," << b[1] << "," << b[2] << std::endl; }

C# 无分支排序3个数字 在C++或C++中,如何实现三(整数)的无分支排序? 这是可能的吗?< /P> < P>你可以在C++中用: #include <iostream> void sort(int *in) { const int sum = in[0]+in[1]; const int diff = abs(in[1]-in[0]); in[0] = (sum + diff) / 2; in[1] = (sum - diff) / 2; } int main() { int a[] = {3,4,1}; sort(a); sort(a+1); sort(a); std::cout << a[0] << "," << a[1] << "," << a[2] << std::endl; int b[] = {1,2,3}; sort(b); sort(b+1); sort(b); std::cout << b[0] << "," << b[1] << "," << b[2] << std::endl; },c#,c++,C#,C++,您可以编写max、min和swap无分支函数。拥有这些函数后,您可以使用它们编写排序函数,如下所示: void sort(int &a, int &b, int &c) { int m1 = max(a,b,c); int m2 = min(a,b,c); b = a + b + c - m1 - m2; swap(m1, a); swap(m2, c); } 以下是帮助器函数: void swap(int &a, int

您可以编写
max
min
swap
无分支函数。拥有这些函数后,您可以使用它们编写
排序
函数,如下所示:

void sort(int &a, int &b, int &c)
{
    int m1 = max(a,b,c);
    int m2 = min(a,b,c);
    b = a + b + c - m1 - m2;
    swap(m1, a);
    swap(m2, c);
}
以下是帮助器函数:

void swap(int &a, int &b)
{
   int tmp = a; a = b; b = tmp;
}

int max( int a, int b, int c ) {
   int l1[] = { a, b };
   int l2[] = { l1[ a<b ], c };
   return l2[ l2[0] < c ];
}
int min( int a, int b, int c ) {
   int l1[] = { a, b };
   int l2[] = { l1[ a>b ], c };
   return l2[ l2[0] > c ];
}
输出(降序):

演示:


我已经从@David的答案中获得了
max
的实现,并且实现了
min
,没有任何条件。只有一个演员。完美的解决方案

int abs (int a) 
{
    int b = a;
    b = (b >> (sizeof(int)*CHAR_BIT-1) & 1);
    return 2 * b * (a) + a; 
}
int max (int a, int b) { return (a + b + abs(a - b)) / 2; }
int min (int a, int b) { return (a + b - abs(a - b)) / 2; }


void sort (int & a, int & b, int & c)
{       
   int maxnum = max(max(a,b), c);
   int minnum = min(min(a,b), c);
   int middlenum = a + b + c - maxnum - minnum;
   a = maxnum;
   b = middlenum;
   c = minnum;
}


嗯?这些是随机的句子吗?我不明白你的问题。请告诉我们你的最佳猜测。你说没有条件的分类是什么意思?我不是故意小气,但你的句子结构太差,几乎无法理解。试着清理一下你的语法,更明确地说出你想要达到的目标,这样你就更有可能得到答案。正如@MooingDuck所说,示例非常有用。请解释“无条件”的含义。我很确定问题是,“如何在不使用条件运算符的情况下对3个整数值进行排序”。更实用的版本是“如何为3个值编写无分支排序”。如果你的英语不是那么好的话,这里肯定很糟糕,但我想大多数国际软件开发也是如此。在x86上,将成为分支语句,<和&&都实现为such@awoodland:不太好。只需通过优化编译即可。确实如此,例如使用
g++-O4-S
(4.7.0)min有两条
jle
指令,max有两条
jge
指令,它们都在查看
cmpl
的结果。您引用的答案不正确
cmpl
,后面跟着一条
cmovg
是一个分支
cmovge
cmpl
读取条件代码,并根据之前的结果读取之后的代码。查看条件代码正是分支的定义。@awoodland:好的。我改变了我的解决方案,采用了David的
max
实现。两次交换不足以将所有6种排列按正确顺序排列。例如,
1 2 3
被“排序”为
2 3 1
。我很确定abs分支的默认实现,但您可以通过简单的十六进制ANDing来删除负性位来避免分支。此外,根据OP是否将函数调用视为分支,您可能希望显式内联该方法。但这些都是微不足道的——很好的答案@FredOverflow-你说得对,我通过添加额外的交换来修复它。@Dracorat-我添加了另一个版本,其中包括
myabs
,它是无分支的。(不过,GCC是在幕后这样做的)。调用函数是无条件的,因此不能真正被视为分支。我不能多次+1您的代码=)不起作用,因为(在其他更容易修复的错误中)
abs
不会返回
a
的绝对值。更正了所有错误。我不喜欢依赖于知道int的大小,但如果不知道,我需要一个while循环,这是一个条件。因为它先做2*b,所以很安全。但是,如果您想确定,可以在2*左右添加括号b@Xaade:为什么不直接问编译器int的大小:)通常存在的疑问适用于负值的
>
结果。使用C#可能会解决问题,这是问题所允许的;-)<代码>b=(b>>(sizeof(int)*字符位1)&1)具有负数的实现行为<代码>2*b*(a)+a应该是
2*b*(-a)+a并且在算术溢出的情况下会有未定义的行为<代码>返回(a+b+abs(a-b))/2潜在算术溢出,与
intmiddlenum=a+b+c-maxnum-minnum相同。。。恐怕这不是一个完美的解决方案。
int main() {
        int a,b,c;
        std::cin >> a >> b >> c;
        sort(a,b,c);
        std::cout << a <<"," << b << "," << c << std::endl;
        return 0;
}
21 242 434
434, 242, 21
int abs (int a) 
{
    int b = a;
    b = (b >> (sizeof(int)*CHAR_BIT-1) & 1);
    return 2 * b * (a) + a; 
}
int max (int a, int b) { return (a + b + abs(a - b)) / 2; }
int min (int a, int b) { return (a + b - abs(a - b)) / 2; }


void sort (int & a, int & b, int & c)
{       
   int maxnum = max(max(a,b), c);
   int minnum = min(min(a,b), c);
   int middlenum = a + b + c - maxnum - minnum;
   a = maxnum;
   b = middlenum;
   c = minnum;
}