マージソートアルゴリズムのスワップ/比較数をカウントする

TautvydasBūda

マージソート中に発生したスワップと比較の数を数える必要があります。比較数のカウントは問題ないと思います。再帰のために、配列の長さと同じ数の数を取得します。どういうわけか、それらの数をマージソート関数の変数に格納する必要がありますか?また、合計スワップをカウントする方法についてのアイデアを知りたいです

    void merge(double arr[], int l, int m, int r)
    {
        int counter = 0;//number of comparisons
        int i, j, k;
        int n1 = m - l + 1;
        int n2 =  r - m;
        int cc;
        /* create temp arrays */
        double L[n1], R[n2];
        /* Copy data to temp arrays L[] and R[] */
        for (i = 0; i < n1; i++)
            L[i] = arr[l + i];
        for (j = 0; j < n2; j++)
            R[j] = arr[m + 1+ j];
        /* Merge the temp arrays back into arr[l..r]*/
        i = 0; // Initial index of first subarray
        j = 0; // Initial index of second subarray
        k = l; // Initial index of merged subarray
        while (i < n1 && j < n2)
            {

                if (L[i] <= R[j])
                {
                    arr[k] = L[i];
                    i++;
                }
                else
                {
                    arr[k] = R[j];
                    j++;
                }
                k++;
                counter++;
        }
        cout << counter << endl;
    /* Copy the remaining elements of L[], if there
       are any */
        while (i < n1)
        {
            arr[k] = L[i];
            i++;
            k++;
        }
    /* Copy the remaining elements of R[], if there
       are any */
        while (j < n2)
        {
            arr[k] = R[j];
            j++;
            k++;
              }
    }
    void mergeSort(double arr[], int l, int r)
         {
          if (l < r)
         {
            // Same as (l+r)/2, but avoids overflow for
        // large l and h
        int m = l+(r-l)/2;
        // Sort first and second halves
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);
        merge(arr, l, m, r);
        }
    }
PaulMcKenzie

これは@JerryCoffinの回答に似ていますが、消化するのが少し簡単かもしれません。

簡単な解決策は、このコードをクラスint swapcountに配置し、スワップが実行されるたびにインクリメントする、と呼ばれることもあるメンバー変数を用意することです。これにより、ローカルスワップカウンター変数を維持する必要がなくなります。

class MergeSorter
{
   int swapCount;
   void merge(double arr[], int l, int m, int r);
   void mergeSort(double arr[], int l, int r);

   public:
       MergeSorter() : swapCount(0) { }
       void startSort(double arr[], int l, int r);
       int getSwapCount() const { return swapCount; }
};

void MergeSorter::merge(double arr[], int l, int m, int r)
{
   // code here to merge.  In here, you increment swapCount
}

void MergeSorter::mergeSort(double arr[], int l, int r)
{
    if (l < r)
    {
        int m = l+(r-l)/2;
        mergeSort(arr, l, m);
        mergeSort(arr, m+1, r);
        merge(arr, l, m, r);
    }    
}

void MergeSorter::startSort(double arr[], int l, int r)
{
  swapCount = 0;  // start at 0
  mergeSort(arr, l, r);
}

int main()
{
   double arr[] = {1, 2, 3, 45, 5, 7};
   MergeSorter ms;
   ms.startSort(arr, 0, 5); // or whatever the arguments are
   std::cout << "The number of swaps is " << ms.getSwapCount();
}

startSortクラス内でソートを開始する関数があることに注意してくださいではmerge機能、swapCount必要に応じて増加します。最後に、の値を出力するだけですms.swapCount

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonのマージソートアルゴリズムでスワップをカウントするにはどうすればよいですか?

分類Dev

クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

分類Dev

2つのソートされたリストを比較し、同じ要素の数をカウントするPythonアルゴリズム

分類Dev

バブルソートのようなアルゴリズムを使用して、最初のk-最小要素をソートするためのスワップの数をカウントします

分類Dev

選択ソートアルゴリズムのスワップ

分類Dev

スワップベースのソートアルゴリズムのスワップ数のパリティ

分類Dev

リストエントリをマップにソートするアルゴリズムのパフォーマンス

分類Dev

ヒープソートアルゴリズムの比較数

分類Dev

クラスカルのアルゴリズムでエッジをソートする最良のオプションは?

分類Dev

マージソートを使用しない反転カウントアルゴリズム(c ++)

分類Dev

C ++でマージソートアルゴリズムを使用してカウント反転を実装する

分類Dev

AVLツリー内のノード数をカウントするアルゴリズム

分類Dev

この特定のクイックソートアルゴリズムで比較数を見つける

分類Dev

カウントステップPythonのユークリッドアルゴリズムプログラム

分類Dev

ソートアルゴリズムのカウントにおける要素のカウントの減少

分類Dev

0と1を含むソートされた配列からゼロの数をカウントするためのアルゴリズム。

分類Dev

ソートされていないリストをマージするPython-アルゴリズム分析

分類Dev

カスタムソートアルゴリズムを使用したカードのソートデッキ

分類Dev

範囲アルゴリズム内の数値をカウントする(C ++)

分類Dev

ヒープを再帰的に構築するためのトップダウンアルゴリズム

分類Dev

整数グリッドの数をカウントするための効率的なアルゴリズム

分類Dev

単語リスト内の文字のカウントマトリックスアルゴリズムを最適化する

分類Dev

手続き型カウンターパートと比較してJava8関数型アルゴリズムを最適化する

分類Dev

C ++マルチスレッド-スレッドとのマージソートの代替アルゴリズム

分類Dev

ソートアルゴリズムにおけるさまざまなリストの比較数

分類Dev

カウントソートアルゴリズムの実装の問題

分類Dev

元のインデックスに従ってソートするソートアルゴリズム

分類Dev

数値をソートするアルゴリズム

分類Dev

リンクリストのループをチェックするアルゴリズム

Related 関連記事

  1. 1

    Pythonのマージソートアルゴリズムでスワップをカウントするにはどうすればよいですか?

  2. 2

    クイックソートアルゴリズムにカウンターを追加して、スワップアクションの総数を表示する

  3. 3

    2つのソートされたリストを比較し、同じ要素の数をカウントするPythonアルゴリズム

  4. 4

    バブルソートのようなアルゴリズムを使用して、最初のk-最小要素をソートするためのスワップの数をカウントします

  5. 5

    選択ソートアルゴリズムのスワップ

  6. 6

    スワップベースのソートアルゴリズムのスワップ数のパリティ

  7. 7

    リストエントリをマップにソートするアルゴリズムのパフォーマンス

  8. 8

    ヒープソートアルゴリズムの比較数

  9. 9

    クラスカルのアルゴリズムでエッジをソートする最良のオプションは?

  10. 10

    マージソートを使用しない反転カウントアルゴリズム(c ++)

  11. 11

    C ++でマージソートアルゴリズムを使用してカウント反転を実装する

  12. 12

    AVLツリー内のノード数をカウントするアルゴリズム

  13. 13

    この特定のクイックソートアルゴリズムで比較数を見つける

  14. 14

    カウントステップPythonのユークリッドアルゴリズムプログラム

  15. 15

    ソートアルゴリズムのカウントにおける要素のカウントの減少

  16. 16

    0と1を含むソートされた配列からゼロの数をカウントするためのアルゴリズム。

  17. 17

    ソートされていないリストをマージするPython-アルゴリズム分析

  18. 18

    カスタムソートアルゴリズムを使用したカードのソートデッキ

  19. 19

    範囲アルゴリズム内の数値をカウントする(C ++)

  20. 20

    ヒープを再帰的に構築するためのトップダウンアルゴリズム

  21. 21

    整数グリッドの数をカウントするための効率的なアルゴリズム

  22. 22

    単語リスト内の文字のカウントマトリックスアルゴリズムを最適化する

  23. 23

    手続き型カウンターパートと比較してJava8関数型アルゴリズムを最適化する

  24. 24

    C ++マルチスレッド-スレッドとのマージソートの代替アルゴリズム

  25. 25

    ソートアルゴリズムにおけるさまざまなリストの比較数

  26. 26

    カウントソートアルゴリズムの実装の問題

  27. 27

    元のインデックスに従ってソートするソートアルゴリズム

  28. 28

    数値をソートするアルゴリズム

  29. 29

    リンクリストのループをチェックするアルゴリズム

ホットタグ

アーカイブ