ifsなしで並べ替え

良い一日。 それが起こったので、最近、私は私の国で最高の大学の一つの誇り高き学生になりました。 良くも悪くも、これは重要なポイントですが、それはポイントではありません。 最も面白いのは、実験室では、先生が楽しみのためか、アルゴリズムに非常にうるさいことを思い出させてくれることです。時々、グループの他の部分とは異なるタスクを与えます。 後者の1つは、私にとっては注目に値しますが、条件ステートメント(if、switchなど)を使用せずに配列を並べ替えることです。

以前はフレームワークとライブラリの暖かい世界に住んでいたことがあり、そのようなタスクをこれまで経験したことがないので、そのようなラボに少し驚いた。 一般的に、先生の数字は「数字は0〜100の範囲に制限されています」や「複数の配列を使用できます」などのフレーズで正しい決定を下すように促しますが、少なくともペアの期間は解決策が見つかりませんでした。 一般に、カップルは、ソートタスクが終了する5分前に終了しました。数の異なる桁の数を数えるなど、ある種のささいなことで置き換えられました。

そして時々起こるように、この研究室を喜んで忘れて人生を楽しみ続ける代わりに、時々私は選別作業に戻り、その解決策を思いつきました。 実際に、あなたと共有したいです。 それは驚くほどシンプルで、追加の配列を使用せずに出てきました(したがって、おそらくタスクにはもう1つのソリューションがあります)。

プログラムコードは次のとおりです。



#include <iostream> using namespace std; int myAbs(int a){ int oldByte = (a >> 31)& 0x1; return -a*(1+oldByte-1)-a*(oldByte-1); } int getMax(int a, int b) { return (a + b + myAbs(a - b)) / 2; } int getMin(int a, int b) { return (a + b - myAbs(a - b)) / 2; } int main() { int arr[] = {34, 12, 24, 65, 63, 22}; int arraySize = (sizeof(arr) / sizeof(*arr)); int maxPosition = 0; int maxElement = arr[0]; int minValue= arr[0]; for (int k = 0; k < arraySize; k++) { for (int i = k; i < arraySize; i++) { int newMax = getMax(maxElement, arr[i]); minValue = getMin(minValue, arr[i]); maxPosition =getMin((myAbs(newMax ^ maxElement) + 1) * (maxPosition + 1), (myAbs(newMax ^ arr[i]) + 1) * (i + 1)) -1; maxElement = newMax; } int buf = arr[k]; arr[k] = maxElement; arr[maxPosition] = buf; maxElement = minValue; } for(int a:arr){ cout<<a<<endl; } return 0; }
      
      







PS大学ではそれはさらに面白いです。



All Articles