2

単純な挿入ソートを試みています。しかし、ビット単位の操作を使用すると、私が試みているスワッピングが機能しません。

しかし、別の一時変数を使用すると、スワッピングが機能します。このコードをコンパイルすると、常に余分な 0 が得られます。

コードの何が問題なのかを知るにはどうすればよいですか?

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<algorithm>

using namespace std;

void swap(int* a, int* b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}

int main(void)

{
int arr[size];
int i,j,min;

for(i=0; i<size; i++)
    arr[i]=rand()%100;

for(i=0; i<size; i++)
    printf("%d ",arr[i]);
putchar('\n');

for(i=0; i<size;i++)
{
    min=i;
    for(j=i+1;j<size;j++)
        if(arr[j]<arr[min])
            min=j;
    swap(&arr[i],&arr[min]);
}

for(i=0; i<size; i++)
    printf("%d ",arr[i]);
putchar('\n');

return 0;
}
4

2 に答える 2

7

for(i=0; i<size;i++)
{
    min=i;
    for(j=i+1;j<size;j++)
        if(arr[j]<arr[min])
            min=j;
    swap(&arr[i],&arr[min]);
}

が最小の配列要素である場合arr[i]、それ自体とスワップしようとするため、スワップに渡す 2 つのポインターは同じメモリ位置を指すため、xor はその位置をゼロにします。

于 2012-05-21T20:41:48.277 に答える
1

挿入ソートを使用しているので、これは演習だと思いますか?

と が同じアドレスを参照するとどうswapなるaと 思いますか? b一枚の紙の上で試してみると、余分なゼロがどこから来るのかがわかります.

于 2012-05-21T20:44:37.450 に答える