ホームページ バックエンド開発 PHPチュートリアル ソートアルゴリズム - マージソート [コード付き]

ソートアルゴリズム - マージソート [コード付き]

Aug 22, 2019 pm 05:06 PM
ソートアルゴリズム

ソートアルゴリズム - マージソート [コード付き]

#マージソートとは何ですか?

簡単に言えば、マージソートは 2 つの順序付けされたシーケンスを統合することです。

推奨チュートリアル: PHP ビデオ チュートリアル

2 つの順序付けされたシーケンスを結合する方法それらを統合しますか?

次に、M = {m1, m2, m3, ...., mx} シーケンスと N = {n1, n2, n3, .... があると仮定します。 , ny} シーケンスの場合、これら 2 つのシーケンスはすでに順序付けされたシーケンスです。最初に空のシーケンス K = {} を作成し、次に m1 と n1 を比較し、m1

マージソートは順序のある配列を統合するものなので、順序のない配列はソートできないということではないでしょうか?この条件は厳しすぎますよね?

マージ ソートは分割統治法に基づいており、完全に無秩序なシーケンスをワイヤレスで分割して、順序付けられたシーケンスを実現できます。例: 今、M={m1 があります。 , m2, m3, ...., mx} の場合、M シーケンスは完全に無秩序なシーケンスです。この場合、M シーケンスはいくつかの小さなシーケンス - {m1, m2}、{m3, m4 }....{ mx-1, mx}; 現時点では、これらのシーケンスは順番に並んでおり、マージ操作を通じてソートできるため、マージ ソートは順序のないシーケンスもソートでき、その速度は Stable に属するクイック ソートに次いで 2 番目です。並べ替え。

#シーケンスを分割するにはどうすればよいですか?

前の質問について言及しました。マージ ソートは分割統治に基づいています。分割統治の具体例はパーティション シーケンスに反映されています。例: 今、 M ={ があります。 m1, m2, m3, ...., mx}、最初の分割: M1 = {m1, m2, ..., m(x 1)/2}、M2 = {m(x 1)/ 2 1、 m(x 1)/2 2,...,mx}、最初の除算の後、M1 と M2 シーケンスが得られ、次に M1 と M2 を再度除算し、数回除算した後、x/2 x%2 が得られます。シーケンス を作成し、マージ操作を 1 つずつ実行します。

このアルゴリズムの具体的な手順:

1. 最初のポインター left と middle を指定します (left はシーケンス 1 の最初の要素を指します)。 、右はシーケンス 2 を指します。最初の要素)

2. 左と中央のサイズを比較し、新しく作成されたスペースに小さな要素を配置します。

3. 次のいずれかが表示されるまでステップ 2 を繰り返します。シーケンスは走査されました

4. 新しいスペースに追加されていない残りの要素をコピーして、新しいスペースに直接貼り付けます

アルゴリズムの中心的なステップ:

1. 分割統治法(再帰)を使ってシーケンスを分割します

2. leftとmidの大きさを比較し、小さな要素を追加します新しいスペースへ

#ナレーション 完了したら、コードを貼り付けます: #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 排序__归并排序
{
    class 归并
    {

        public static int[] arr = { 6, 202, 301, 100, 38, 8, 1 ,-1,1000};
        static void Main(string[] args)
        {
            Sort(arr, 0, arr.Length -1);
            foreach (var item in arr)
            {
                Console.Write(item + "  ");
            }
            Console.ReadKey();
        }

        public static void Sort(int []a,int left,int right)
        {
            if (left >= right) return;
            else
            {
                int mid = (left + right) / 2;                //@1
                Sort(a, left, mid);
                Sort(a, mid + 1, right);
                MergeSort(a, left, mid, right);
            }
        }

        public static void MergeSort(int []a,int left,int mid,int right)
        {
            int[] Arr = new int[right - left + 1];
            int l = left, m = mid +1 , k = 0;           //@2
            while ( m <= right && l <= mid )          //@3
            {
                if (a[l] > a[m]) Arr[k++] = a[m++];
                else Arr[k++] = a[l++];
            }
            while (m < right +1)                           //@4
            {
                Arr[k++] = a[m++];
            }
            while (l < mid +1 )  Arr[k++] = a[l++];        //@4
            for (k = 0, l = left; l < right + 1; k++, l++) a[l] = Arr[k];
        }
    }
}
ログイン後にコピー

コード解釈:


@1: Sort() 関数はシーケンスのセグメント化を完了します。再帰ごとにシーケンスが 2 つに分割されます。分離できなくなるまで半分にします。

@2: l はシーケンス 1 の最初の要素を表し、m はシーケンス 2 の最初の要素を表し、k は新しい配列内の既存の要素の数を表します Arr

@3: 最初のシーケンス 1 の要素とシーケンス 2 の最初の要素を比較し、小さい方を Arr に入れ、いずれかのシーケンスの要素が比較されるまでシーケンス カーソルを戻します。

@4: 間の比較プロセスシーケンス 1 とシーケンス 2 の場合、シーケンス 1 はすべて Arr に追加されているように見えますが、シーケンス 2 はまだ追加されていない場合、残りの比較されていない要素は Arr に直接コピーされます

概要:

上記のコードは、本当の意味で配列を分割しません。論理的に分割するだけです。他のコードのように、分割された配列を新しい配列に埋めることはありません。これを行うと、速度とメモリにわずかな影響があります。最小限ではありますが、結局のところそれほど良いものではありません。マージ操作では、パラメーターが境界を越えないように注意する必要があります (なぜ @2 の上の m が mid 1 に等しくなければならないのか、長い間考えていました)実際、その理由は非常に単純で、Mid は左の列に属し、mid 1 から始まる右の列にのみ属するからです。コードも変更する必要がありますが、これ以上無駄な比較を行う必要はありません。私は当時、この問題について真剣に考えました(長い間考えた後...)、実際には、論理的な関係がある限り、明確にすると、コードを簡単に把握できます。

以上がソートアルゴリズム - マージソート [コード付き]の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Kuaishou の両面市場における複雑な実験計画の問題 Kuaishou の両面市場における複雑な実験計画の問題 Apr 15, 2023 pm 07:40 PM

1. 問題の背景 1. 両面市場実験の概​​要 両面市場、つまりプラットフォームには、生産者と消費者の 2 つの参加者が含まれ、双方がお互いを促進します。たとえば、Kuaishou にはビデオ制作者とビデオ消費者がおり、この 2 つのアイデンティティはある程度重複する可能性があります。バイラテラル実験とは、生産者側と消費者側のグループを組み合わせた実験手法です。双方向実験には以下のようなメリットがあります。 (1) 製品の DAU や作品アップロード者数の変化など、新たな戦略による 2 つの側面への影響を同時に検出できます。二国間プラットフォームには多くの場合クロスサイドネットワーク効果があり、読者が増えれば増えるほど著者の活動が活発になり、著者の活動が活発になればなるほど、より多くの読者がフォローするようになります。 (2) エフェクトのオーバーフローや転送を検出できます。 (3) 作用機序をより深く理解するのに役立ちます。AB 実験自体は、原因と結果の関係を伝えることはできません。

Vue テクノロジー開発でデータをフィルターおよび並べ替える方法 Vue テクノロジー開発でデータをフィルターおよび並べ替える方法 Oct 09, 2023 pm 01:25 PM

Vue テクノロジ開発でデータをフィルタリングおよび並べ替える方法 Vue テクノロジ開発では、データのフィルタリングと並べ替えは非常に一般的で重要な機能です。データのフィルタリングと並べ替えを通じて、必要な情報を迅速にクエリして表示できるため、ユーザー エクスペリエンスが向上します。この記事では、Vue でデータをフィルターおよび並べ替える方法を紹介し、読者がこれらの関数をよりよく理解して使用できるように具体的なコード例を示します。 1. データのフィルタリング データのフィルタリングとは、特定の条件に基づいて要件を満たすデータをフィルタリングすることを指します。 Vue では、comp を渡すことができます

Google は AI を使用して 10 年間にわたるランキング アルゴリズムの封印を破りました。このアルゴリズムは毎日何兆回も実行されていますが、ネチズンはこれが最も非現実的な研究だと主張していますか? Google は AI を使用して 10 年間にわたるランキング アルゴリズムの封印を破りました。このアルゴリズムは毎日何兆回も実行されていますが、ネチズンはこれが最も非現実的な研究だと主張していますか? Jun 22, 2023 pm 09:18 PM

並べ替え | Nuka-Cola、Chu Xingjuan 基本的なコンピューター サイエンスのコースを受講した友人なら、並べ替えアルゴリズムを個人的に設計したはずです。つまり、コードを使用して、順序なしリスト内の項目を昇順または降順に並べ替えます。これは興味深い挑戦であり、実現する方法はたくさんあります。並べ替えタスクをより効率的に実行する方法を見つけるために、多くの時間が費やされてきました。基本的な操作として、並べ替えアルゴリズムはほとんどのプログラミング言語の標準ライブラリに組み込まれています。オンラインで大量のデータを整理するために、世界中のコードベースでさまざまなソート手法やアルゴリズムが使用されていますが、少なくとも LLVM コンパイラで使用される C++ ライブラリに関する限り、ソート コードは 10 年以上変わっていません。 。最近、Google DeepMindAI チームは、

Swoole Advanced: マルチスレッドを使用して高速ソート アルゴリズムを実装する方法 Swoole Advanced: マルチスレッドを使用して高速ソート アルゴリズムを実装する方法 Jun 14, 2023 pm 09:16 PM

Swoole は、PHP 言語をベースとした高性能ネットワーク通信フレームワークで、複数の非同期 IO モードと複数の高度なネットワーク プロトコルの実装をサポートしています。 Swoole をベースとして、そのマルチスレッド機能を使用して、高速ソート アルゴリズムなどの効率的なアルゴリズム操作を実装できます。高速ソートアルゴリズム (QuickSort) は一般的なソートアルゴリズムであり、ベンチマーク要素を配置すると、要素が 2 つの部分列に分割され、ベンチマーク要素より小さいものは左側に配置され、ベンチマーク以上の要素は左に配置されます。要素が右側に配置され、次に左右のサブシーケンスが配置されます。

C# で選択ソート アルゴリズムを実装する方法 C# で選択ソート アルゴリズムを実装する方法 Sep 20, 2023 pm 01:33 PM

選択ソート アルゴリズムを C# で実装する方法 選択ソート (SelectionSort) は、単純で直感的なソート アルゴリズムであり、その基本的な考え方は、毎回ソートする要素から最小 (または最大) の要素を選択し、それを最後に配置することです。ソートされたシーケンス。すべての要素が並べ替えられるまで、このプロセスを繰り返します。 C# で選択並べ替えアルゴリズムを実装する方法と、具体的なコード例について詳しく学びましょう。選択ソートメソッドの作成 まず、選択ソートを実装するメソッドを作成する必要があります。このメソッドは、

C++ で基数ソート アルゴリズムを使用する方法 C++ で基数ソート アルゴリズムを使用する方法 Sep 19, 2023 pm 12:15 PM

C++ で基数ソート アルゴリズムを使用する方法 基数ソート アルゴリズムは、並べ替える要素を限られた桁のセットに分割することによって並べ替えを完了する非比較並べ替えアルゴリズムです。 C++ では、基数ソート アルゴリズムを使用して整数のセットをソートできます。以下では、特定のコード例を使用して、基数ソート アルゴリズムを実装する方法を詳しく説明します。アルゴリズムのアイデア 基数ソート アルゴリズムのアイデアは、ソート対象の要素を限られたデジタル ビットのセットに分割し、各ビットで順番に要素をソートすることです。各ビットのソートが完了しました

配列のソートアルゴリズムは何ですか? 配列のソートアルゴリズムは何ですか? Jun 02, 2024 pm 10:33 PM

配列ソートアルゴリズムは、要素を特定の順序で配置するために使用されます。一般的なアルゴリズムの種類は次のとおりです。 バブル ソート: 隣接する要素を比較して位置を交換します。選択ソート: 最小の要素を見つけて、それを現在の位置に入れ替えます。挿入ソート: 要素を 1 つずつ正しい位置に挿入します。クイックソート: 分割統治法。配列を分割するピボット要素を選択します。マージソート: 分割統治、再帰的ソート、およびサブ配列のマージ。

さまざまな PHP 配列ソート アルゴリズムのアプリケーション シナリオに関するディスカッション さまざまな PHP 配列ソート アルゴリズムのアプリケーション シナリオに関するディスカッション Apr 28, 2024 am 09:39 AM

さまざまなシナリオでは、適切な PHP 配列ソート アルゴリズムを選択することが重要です。バブル ソートは安定性を必要としない小規模な配列に適しており、クイック ソートは安定性が高く、安定性を必要としない状況に適しています。 ; ヒープソートは最大値または最小値を効率的に見つけます。実際のケースを比較すると、時間効率の点ではクイックソートが他のアルゴリズムより優れていますが、安定性を考慮する必要がある場合はマージソートを選択する必要があります。

See all articles