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;
}