1

したがって、バイトニックソート用のCコードがいくつかあり、そのコードをC#に変換しようとしています。Cコードの行の1つが私を混乱させています。私はこれまでCと一緒に仕事をしたことがありません。

        void merge_up(int *arr, int n) {
      int step=n/2,i,j,k,temp;
      while (step > 0) {
        for (i=0; i < n; i+=step*2) {
          for (j=i,k=0;k < step;j++,k++) {
        if (arr[j] > arr[j+step]) {
          // swap
          temp = arr[j];
          arr[j]=arr[j+step];
          arr[j+step]=temp;
        }
          }
        }
        step /= 2;
      }
    }

    void merge_down(int *arr, int n) {
      int step=n/2,i,j,k,temp;
      while (step > 0) {
        for (i=0; i < n; i+=step*2) {
          for (j=i,k=0;k < step;j++,k++) {
        if (arr[j] < arr[j+step]) {
          // swap
          temp = arr[j];
          arr[j]=arr[j+step];
          arr[j+step]=temp;
        }
          }
        }
        step /= 2;
      }
    }

    void printArray(int *arr, int n) {
      int i;

      printf("[%d",arr[0]);
      for (i=1; i < n;i++) {
        printf(",%d",arr[i]);
      }
      printf("]\n");
    }

    int main(int argc, char **argv) {
      int n, *arr, i,s;
      FILE *fp = fopen(argv[1],"r");

      if (fp == NULL) {
        fprintf(stderr,"file not found\n");
        exit(1);
      }
      // first line gives number of numbers to be sorted 
      fscanf(fp,"%d",&n);
      // allocate space and read all the numbers 
      arr = (int *)malloc(n*sizeof(int));
      for (i=0; i < n; i++) {
        fscanf(fp,"%d",(arr+i));
      }
      // print array before 
      printArray(arr,n);

      // do merges
      for (s=2; s <= n; s*=2) {
        for (i=0; i < n;) {
          merge_up((arr+i),s);
          merge_down((arr+i+s),s); //Having trouble with this line here.
          i += s*2;
        }
      }

      printArray(arr,n);
    }

merge_down((arr + i + s)、s);を呼び出すと何をしますか。

具体的には、arr + i+sです。arrは配列ですが、+ i + sは何をしていますか?助けていただければ幸いです。

-編集:その部分に対してC#で行ったことを追加する必要があります。これはiveが得たものです:

 //Do merges
        for (int s = 2; 2 <= n; s = s * 2)
        {
            for(int i = 0; i < n;){
                mergeUp(arr, s);
                mergeDown(arr, s);
                i += s * 2;
            }
        }
4

2 に答える 2

4

ポインタ演算。arrは配列の先頭へのポインタであるため、基本的にはへのポインタを作成するのと同じarr[i+s]です。

unsafeポインター演算はC#ではサポートされていません(コードを除く)。このコードをC#に変換するには、パラメーターを受け取るために渡すmergeDownか、署名を変更するための新しい配列を作成する必要があります。または、またはを受け入れて@JimBalterの回答を使用することもできます。mergeDownstartIndexmergeDownIEnumerable<T>ArraySegment<T>

于 2013-03-11T02:13:33.383 に答える
1

その部分についてC#で行ったことを追加する必要があります。これは私が得たものです:

   ...
   mergeUp(arr, s);
   mergeDown(arr, s);

あなたが欲しいのは

   mergeUp(arr.Take(i), s);

   mergeDown(arr.Take(i+s), s);

または、おそらくより適切に使用しますArraySegment<T>C# の配列スライスを参照してください。

于 2013-03-11T02:27:00.983 に答える