答えて
条件なし。 uintへのキャストのみ。完璧なソリューション。
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;
}
(他のより簡単に修正可能なエラーの中で) 'abs'は' a'の絶対値を返さないので動作しません。 –
すべてのエラーを修正しました。私はintのサイズを知ることに頼るのが好きではありませんが、そのことを知らないとwhileループが必要です。これは条件付きです。最初は2 * bなので、安全です。しかし、あなたが確かめたいのであれば、2 * bの括弧を付け加えることができます –
@Xaade:intのサイズはコンパイラに問い合わせてください:) –
あなたは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;
}
。
私は倍のsort
右の番号に電話して、テンプレートメタプログラミングを使用して、完全にジェネリック版を作りました。私のx86ボックスでgcc 4.7.0を望むのとまったく同じようにインライン展開されます(ただし、call
はx86でも無条件ですが)。私も(ただし、それはx86用のgccの__builtin_abs
実装に基づいている、それが少ないポータブル作る整数についていくつかの仮定を行う)のx86上の枝を避けabs関数を実装しました:
#include <iostream>
#include <limits.h>
void myabs(int& in) {
const int tmp = in >> ((sizeof(int) * CHAR_BIT) - 1);
in ^= tmp;
in = tmp - in;
}
template <int N, int I=1, bool C=false>
struct sorter {
static void sort(int *in) {
const int sum = in[I-0]+in[I-1];
int diff = in[I-1]-in[I-0];
myabs(diff);
in[I-0] = (sum + diff)/2;
in[I-1] = (sum - diff)/2;
sorter<N, I+1, I+1>=N>::sort(in);
}
};
template <int N,int I>
struct sorter<N,I,true> {
static void sort(int *in) {
sorter<N-1>::sort(in);
}
};
template <int I, bool C>
struct sorter<0,I,C> {
static void sort(int *) {
}
};
int main() {
int a[] = {3,4,1};
sorter<3>::sort(a);
std::cout << a[0] << "," << a[1] << "," << a[2] << std::endl;
}
2つのスワップは、6つの並べ替えのすべてを正しい順序で行うには不十分です。たとえば、 '1 2 3'は「2 3 1」に「ソート」されます。 – fredoverflow
私はabsブランチのデフォルト実装については確信していますが、ブランチを避けることができます。また、OPが関数呼び出しをブランチと見なすかどうかによって、メソッドを明示的にインライン化することもできます。しかし、それらは簡単です - 良い答え! – Dracorat
@FredOverflow - あなたはそうだ、私は余分なスワップを追加することでそれを修正した。 – Flexo
あなたはmax
を書くことができ、 min
およびswap
ブランチフリー機能
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 ];
}
テストコード:
int main() {
int a,b,c;
std::cin >> a >> b >> c;
sort(a,b,c);
std::cout << a <<"," << b << "," << c << std::endl;
return 0;
}
入力:
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);
}
そして、ここでは、ヘルパー関数は次のとおりです。あなたがこれらの機能を持っていたら、あなたはsort
関数を記述するためにそれらを使用することができます
21 242 434
出力(降順):
434, 242, 21
私はhereからデビッドの答え@からmax
の実装を取り、少しひねりを加えたmin
を実装しています。
- 1. 3つの値を並べ替え
- 2. JavaScript配列を3つの値で並べ替えます
- 3. ソートで数値的に並べ替え
- 4. 並べ替え前と並べ替え後の値のストリーム
- 5. 並べ替えメソッドを持つ人物の並べ替え
- 6. JTable内の数値の並べ替え
- 7. 配列を数値で並べ替え
- 8. 複合数値の並べ替え
- 9. C#複数の値で並べ替え
- 10. シバン全体をソートせずにテーブルを並べ替える
- 11. 選択並べ替え並べ替え
- 12. 並べ替えで並べ替え
- 13. 並べ替えObservableコレクションアルファ数値
- 14. ピボットグラフ値で並べ替え
- 15. [並べ替え基準値
- 16. Railsドロップダウンリスト並べ替え値
- 17. R:3つの列に行列を並べ替えます。
- 18. 数値を数えて並べ替える
- 19. VBA - ドラッグ&ドロップによる並べ替えの並べ替え
- 20. Laravel 4.2並べ替えの関係による並べ替え
- 21. MarkLogic node.js api - グループを並べ替え、並べ替えで並べ替え
- 22. いくつかの並べ替えウィンドウの3つのドットメニュー
- 23. C++の選択並べ替えなし並べ替え並べ替えなし
- 24. 配列の値の順序を変えずに並べ替える方法は?
- 25. dictを値で並べ替え、次にキーで並べ替える1つのライナー?
- 26. ルートカテゴリ別にカテゴリの並べ替えを並べ替え
- 27. コンマを表示せずに配列を並べ替え
- 28. 表示テーブルを使用せずにdivを並べ替え
- 29. 一時変数を使用せずに配列を並べ替える
- 30. 配列を使用せずに降順で整数を並べ替える
Huh?これらのランダムな文章ですか? –
私はあなたの質問を理解していません。あなたの最高の推測をお見せください。条件なしでソートするのはどういう意味ですか? –
私は意味を成し遂げようとしていませんが、あなたの文章はあまりにも邪悪であり、ほとんど理解できません。あなたの文法をきれいにして、あなたが達成しようとしていることについてもう少し明確にしてください。あなたは答えを得る可能性がより高くなります。 @MooingDuckが述べたように、例はとても役に立ちます。 – mydogisbox