1

ボトムアップマージソートに問題があります。並べ替え/マージに問題があります。現在のコードは次のとおりです。

   public void mergeSort(long[] a, int len) {
        long[] temp = new long[a.length];
        int length = 1;
        while (length < len) {
            mergepass(a, temp, length, len);
            length *= 2;
        }
    }


   public void mergepass(long[] a, long[] temp, int blocksize, int len) {
       int k = 0;
        int i = 1;
       while(i <= (len/blocksize)){
           if(blocksize == 1){break;}
           int min = a.length;
           for(int j = 0; j < blocksize; j++){
               if(a[i*j] < min){
                   temp[k++] = a[i*j];
                   count++;
               }
               else{
                   temp[k++] = a[(i*j)+1];
                   count++;
               }
           }
           for(int n = 0; n < this.a.length; n++){
               a[n] = temp[n];
           }
       }
    }
4

1 に答える 1

2

明らかな問題:

  • i増加することはありません。
  • 配列内の 2 つの要素を比較することは決してありません。(それif(a[i*j] < min)がやるべきことなのか? 私にはわかりません。)
  • なぜあなたは掛けiているのjですか?
  • なにthis.a.length

スタイルの問題:

  • mergeSort()len配列には暗黙的な長さがありますが、引数として取ります。さらに悪いことに、関数は and も使用a.lengthlengthます。
  • 一般的に変数名は貧弱です。

要点:

  • 同じサイズの 2 つ目の配列を作成する場合は、一時的な配列に並べ替えて再度コピーするのではなく、一方を「ソース」、もう一方を「宛先」にしてパス間で交換するのが一般的です。 .
于 2010-10-02T02:18:01.453 に答える