追加の整数変数を 1 つだけ使用して整数のリストを並べ替えるにはどうすればよいですか?
質問
1 つの変数だけを使用して値のリストを並べ替えるにはどうすればよいですか?
編集:@Igorのコメントに従って、質問のタイトルを変更しました。
解決
C での解決策:
#include <stdio.h>
int main()
{
int list[]={4,7,2,4,1,10,3};
int n; // the one int variable
startsort:
for (n=0; n< sizeof(list)/sizeof(int)-1; ++n)
if (list[n] > list[n+1]) {
list[n] ^= list[n+1];
list[n+1] ^= list[n];
list[n] ^= list[n+1];
goto startsort;
}
for (n=0; n< sizeof(list)/sizeof(int); ++n)
printf("%d\n",list[n]);
return 0;
}
もちろん出力はアイコンプログラムと同じです。
他のヒント
私があなたの代わりに宿題をしているのだと思いますが、興味深い挑戦ですね。ここに解決策があります アイコン:
procedure mysort(thelist)
local n # the one integer variable
every n := (1 to *thelist & 1 to *thelist-1) do
if thelist[n] > thelist[n+1] then thelist[n] :=: thelist[n+1]
return thelist
end
procedure main(args)
every write(!mysort([4,7,2,4,1,10,3]))
end
出力:
1
2
3
4
4
7
10
考えられるリスト サイズごとに多数の並べ替えネットワークを生成/作成することができます。並べ替えネットワーク内では、スワップ操作に単一の変数を使用します。
これをソフトウェアで行うことはお勧めしませんが、それでも可能です。
これは、C での最大 4 のすべての n のソート ルーチンです。
// define a compare and swap macro
#define order(a,b) if ((a)<(b)) { temp=(a); (a) = (b); (b) = temp; }
static void sort2 (int *data)
// sort-network for two numbers
{
int temp;
order (data[0], data[1]);
}
static void sort3 (int *data)
// sort-network for three numbers
{
int temp;
order (data[0], data[1]);
order (data[0], data[2]);
order (data[1], data[2]);
}
static void sort4 (int *data)
// sort-network for four numbers
{
int temp;
order (data[0], data[2]);
order (data[1], data[3]);
order (data[0], data[1]);
order (data[2], data[3]);
order (data[1], data[2]);
}
void sort (int *data, int n)
{
switch (n)
{
case 0:
case 1:
break;
case 2:
sort2 (data);
break;
case 3:
sort3 (data);
break;
case 4:
sort4 (data);
break;
default:
// Sorts for n>4 are left as an exercise for the reader
abort();
}
}
明らかに、考えられる N ごとにソート ネットワーク コードが必要です。
詳細はこちら:
Javaでは:
import java.util.Arrays;
/**
* Does a bubble sort without allocating extra memory
*
*/
public class Sort {
// Implements bubble sort very inefficiently for CPU but with minimal variable declarations
public static void sort(int[] array) {
int index=0;
while(true) {
next:
{
// Scan for correct sorting. Wasteful, but avoids using a boolean parameter
for (index=0;index<array.length-1;index++) {
if (array[index]>array[index+1]) break next;
}
// Array is now correctly sorted
return;
}
// Now swap. We don't need to rescan from the start
for (;index<array.length-1;index++) {
if (array[index]>array[index+1]) {
// use xor trick to avoid using an extra integer
array[index]^=array[index+1];
array[index+1]^=array[index];
array[index]^=array[index+1];
}
}
}
}
public static void main(final String argv[]) {
int[] array=new int[] {4,7,2,4,1,10,3};
sort(array);
System.out.println(Arrays.toString(array));
}
}
実は裏技を使うことで ニルスが提案した, 、残りの 1 つの int 割り当ても削除できます。もちろん、代わりにスタックに追加されますが...
ルビーでは:[1、5、3、7、4、2].sort
いいえ、それはすでに並べ替えられています。(質問が曖昧なので、変数はオブジェクトの同義語であると仮定します)
リストがあれば (1 5 3 7 4 2)
そして変数 v
, 、最初に 3 を代入することで、リストの 2 つの値、たとえば 3 と 7 を交換できます。 v
, 、次に 3 の場所に 7 を代入し、最後に の値を代入します。 v
7の元の場所へ。その後、再利用できます v
次回の交換に向けて。並べ替えるために必要なのは、どの値を交換するかを指示するアルゴリズムだけです。たとえば、次の場所で適切なアルゴリズムを探すことができます。 http://en.wikipedia.org/wiki/Sorting_algorithm .