Rumah pembangunan bahagian belakang tutorial php 排序算法—归并排序【附代码】

排序算法—归并排序【附代码】

Aug 22, 2019 pm 05:06 PM
algoritma pengisihan

排序算法—归并排序【附代码】

什么是归并排序?

  归并排序简单来讲,就是将两个有序的序列整合到一起。

推荐教程:PHP视频教程

如何将两个有序的序列整合到一起呢?

  那么我们假设,现在有 M={m1 ,m2,m3,....,mx}序列和 N = {n1,n2,n3,....,ny}序列,这两个序列已经是有序的序列,首先创建一个空序列 K = {},那么接着将 m1 和 n1 进行比较,加入 m1 < n1 那么将 m1 放入 K 序列中,然后 M 序列游标后移,即下一次将进行 m2 和 n1 的比较,直到全部比较完毕,并填入序列 K 中。

既然归并排序是整合有序序列,那么岂不是不能排序无序序列,这条件也太苛刻了点吧?

  归并排序是建立在分治法的基础上进行操作的,也就是可以将一个完全无序的序列进行无线分割以达到有序序列,比如:现在有 M={m1 ,m2,m3,....,mx},M序列是完全无序的序列,那么此时可以将 M 序列分成若干个小序列——{m1,m2},{m3,m4}....{mx-1,mx};此时这些序列就是有序的,那么就可以通过归并操作进行排序,所以归并排序也可以排序无序序列,且速度仅次于快速排序,属于稳定排序。

如何分割序列?

  上个问题已经提过,归并排序是建立在分治的基础上进行操作的,其中分治的体现就体现在分割序列上,比如:现在有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、规定首指针 left 和mid(left指向序列1的首元素,right 指向序列2的首元素)

  2、比较 left 和 mid 的大小,将小的元素放入新建的空间中

  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];
        }
    }
}
Salin selepas log masuk

代码解读:

  @1 :Sort()函数完成了序列的分割,每一次递归都将序列分成两半,直到不能分隔为止。

  @2 :l 代表序列1的首元素,m 代表序列2的首元素,k代表新建数组Arr的已有元素个数

  @3 :序列1的首元素和序列2的首元素进行比较,将小的放入 Arr 中,且序列游标后移,直到其中一个序列的元素遍比较完毕

  @4 :在序列1 和序列2的比较过程中,可能出现序列1已经全部添加进了 Arr 中,但是序列2还没有,则将剩下的未比较的元素直接复制进入 Arr 中

总结:

  以上代码并不是真正意义上的分割数组,只是做了一个逻辑分割,没有像其他代码一样将分割后的数组填入一个新的数组,那样做的话会对速度和内存产生一点影响,虽然微乎其微,但是总归是没这么好的,在归并操作上,需要注意的是参数不要越界(我当时就想了很久为什么 @2 上面的 m 要等于 mid +1 而不是 mid ,其实道理很简单,因为mid是属于左序列,从 mid+1 开始才属于右序列,将m = mid +1  改成 m = mid 不是不行,只是后面的代码也需要改,但是没有必要多做一次无用比较,这个问题我当时真是想了半天...),其实只要理清楚其中的逻辑关系,这样代码就能做到信手拈来。

Atas ialah kandungan terperinci 排序算法—归并排序【附代码】. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Isu reka bentuk eksperimen yang kompleks dalam pasaran dua belah Kuaishou Isu reka bentuk eksperimen yang kompleks dalam pasaran dua belah Kuaishou Apr 15, 2023 pm 07:40 PM

1. Latar belakang masalah 1. Pengenalan kepada eksperimen pasaran dua belah Pasaran dua belah, iaitu platform, merangkumi dua peserta, pengeluar dan pengguna, dan kedua-dua pihak mempromosikan satu sama lain. Sebagai contoh, Kuaishou mempunyai pengeluar video dan pengguna video, dan kedua-dua identiti mungkin bertindih pada tahap tertentu. Eksperimen dua hala ialah kaedah eksperimen yang menggabungkan kumpulan di pihak pengeluar dan pengguna. Percubaan dua hala mempunyai kelebihan berikut: (1) Kesan strategi baharu pada dua aspek boleh dikesan serentak, seperti perubahan dalam DAU produk dan bilangan orang yang memuat naik karya. Platform dua hala selalunya mempunyai kesan rangkaian rentas sisi Semakin ramai pembaca, semakin aktif pengarang, dan semakin aktif pengarang, semakin ramai pembaca yang akan mengikuti. (2) Limpahan kesan dan pemindahan boleh dikesan. (3) Bantu kami lebih memahami mekanisme tindakan Percubaan AB itu sendiri tidak boleh memberitahu kami hubungan antara sebab dan akibat, sahaja

Cara menapis dan mengisih data dalam pembangunan teknologi Vue Cara menapis dan mengisih data dalam pembangunan teknologi Vue Oct 09, 2023 pm 01:25 PM

Cara menapis dan mengisih data dalam pembangunan teknologi Vue Dalam pembangunan teknologi Vue, penapisan dan pengisihan data adalah fungsi yang sangat biasa dan penting. Melalui penapisan dan pengisihan data, kami boleh membuat pertanyaan dan memaparkan maklumat yang kami perlukan dengan cepat, meningkatkan pengalaman pengguna. Artikel ini akan memperkenalkan cara menapis dan mengisih data dalam Vue, dan menyediakan contoh kod khusus untuk membantu pembaca memahami dan menggunakan fungsi ini dengan lebih baik. 1. Penapisan data Penapisan data merujuk kepada penapisan data yang memenuhi keperluan berdasarkan syarat tertentu. Dalam Vue, kita boleh lulus comp

Google menggunakan AI untuk memecahkan meterai sepuluh tahun algoritma pengisihan Ia dilaksanakan bertrilion kali setiap hari, tetapi netizen mengatakan ia adalah penyelidikan yang paling tidak realistik? Google menggunakan AI untuk memecahkan meterai sepuluh tahun algoritma pengisihan Ia dilaksanakan bertrilion kali setiap hari, tetapi netizen mengatakan ia adalah penyelidikan yang paling tidak realistik? Jun 22, 2023 pm 09:18 PM

Menganjurkan |. Nuka-Cola, Chu Xingjuan Rakan-rakan yang telah mengikuti kursus asas sains komputer mestilah secara peribadi mereka bentuk algoritma pengisihan - iaitu, menggunakan kod untuk menyusun semula item dalam senarai tidak tertib dalam susunan menaik atau menurun. Ia adalah satu cabaran yang menarik, dan terdapat banyak cara yang mungkin untuk melakukannya. Banyak masa telah dilaburkan untuk memikirkan cara untuk menyelesaikan tugasan pengasingan dengan lebih cekap. Sebagai operasi asas, algoritma pengisihan dibina ke dalam perpustakaan standard kebanyakan bahasa pengaturcaraan. Terdapat banyak teknik dan algoritma pengisihan yang berbeza digunakan dalam pangkalan kod di seluruh dunia untuk menyusun sejumlah besar data dalam talian, tetapi sekurang-kurangnya setakat perpustakaan C++ yang digunakan dengan pengkompil LLVM, kod pengisihan tidak berubah dalam lebih daripada satu dekad. Baru-baru ini, pasukan Google DeepMindAI kini telah membangunkan a

Swoole Advanced: Cara menggunakan multi-threading untuk melaksanakan algoritma pengisihan berkelajuan tinggi Swoole Advanced: Cara menggunakan multi-threading untuk melaksanakan algoritma pengisihan berkelajuan tinggi Jun 14, 2023 pm 09:16 PM

Swoole ialah rangka kerja komunikasi rangkaian berprestasi tinggi berdasarkan bahasa PHP Ia menyokong pelaksanaan berbilang mod IO tak segerak dan berbilang protokol rangkaian lanjutan. Berdasarkan Swoole, kita boleh menggunakan fungsi berbilang benang untuk melaksanakan operasi algoritma yang cekap, seperti algoritma pengisihan berkelajuan tinggi. Algoritma pengisihan berkelajuan tinggi (QuickSort) ialah algoritma pengisihan biasa Dengan mencari elemen penanda aras, elemen tersebut dibahagikan kepada dua urutan yang lebih kecil daripada elemen penanda aras diletakkan di sebelah kiri, dan yang lebih besar daripada atau sama dengan penanda aras elemen diletakkan di sebelah kanan Kemudian susulan kiri dan kanan diletakkan ulangan susulan

Bagaimana untuk melaksanakan algoritma isihan pemilihan dalam C# Bagaimana untuk melaksanakan algoritma isihan pemilihan dalam C# Sep 20, 2023 pm 01:33 PM

Cara melaksanakan algoritma isihan pemilihan dalam Isih Pemilihan (SelectionSort) ialah algoritma pengisihan yang mudah dan intuitif. Idea asasnya ialah memilih elemen terkecil (atau terbesar) daripada unsur-unsur yang akan diisih setiap kali dan meletakkannya pada penghujung. urutan yang disusun. Ulangi proses ini sehingga semua elemen diisih. Mari ketahui lebih lanjut tentang cara melaksanakan algoritma isihan pemilihan dalam C#, bersama-sama dengan contoh kod tertentu. Mencipta kaedah isihan pemilihan Pertama, kita perlu mencipta kaedah untuk melaksanakan isihan pemilihan. Kaedah ini menerima a

Cara menggunakan algoritma isihan radix dalam C++ Cara menggunakan algoritma isihan radix dalam C++ Sep 19, 2023 pm 12:15 PM

Cara menggunakan algoritma isihan radix dalam C++ Algoritma isihan radix ialah algoritma isihan bukan perbandingan yang melengkapkan isihan dengan membahagikan elemen untuk diisih kepada set digit yang terhad. Dalam C++, kita boleh menggunakan algoritma isihan radix untuk mengisih set integer. Di bawah ini kita akan membincangkan secara terperinci cara melaksanakan algoritma isihan radix, dengan contoh kod tertentu. Idea algoritma Idea algoritma pengisihan radix adalah untuk membahagikan elemen untuk diisih ke dalam set bit digital yang terhad, dan kemudian mengisih elemen pada setiap bit secara bergilir-gilir. Pengisihan pada setiap bit selesai

Apakah algoritma pengisihan untuk tatasusunan? Apakah algoritma pengisihan untuk tatasusunan? Jun 02, 2024 pm 10:33 PM

Algoritma pengisihan tatasusunan digunakan untuk menyusun elemen dalam susunan tertentu. Jenis algoritma biasa termasuk: Isih gelembung: menukar kedudukan dengan membandingkan elemen bersebelahan. Isih pilihan: Cari elemen terkecil dan tukarkannya ke kedudukan semasa. Isih sisipan: Sisipkan elemen satu demi satu ke kedudukan yang betul. Isih pantas: kaedah bahagi dan takluk, pilih elemen pangsi untuk membahagi tatasusunan. Isih Gabung: Bahagi dan Takluk, Isih Rekursif dan Gabungan Subarray.

Perbincangan mengenai senario aplikasi algoritma pengisihan tatasusunan PHP yang berbeza Perbincangan mengenai senario aplikasi algoritma pengisihan tatasusunan PHP yang berbeza Apr 28, 2024 am 09:39 AM

Untuk senario yang berbeza, adalah penting untuk memilih algoritma pengisihan tatasusunan PHP yang sesuai. Isih buih sesuai untuk tatasusunan berskala kecil tanpa keperluan kestabilan mempunyai kerumitan masa yang paling rendah dalam kebanyakan kes yang mempunyai kestabilan yang tinggi dan sesuai untuk senario yang memerlukan keputusan yang stabil sesuai untuk situasi tanpa keperluan kestabilan ; Isihan timbunan mencari nilai maksimum atau minimum dengan cekap. Melalui perbandingan kes sebenar, isihan pantas adalah lebih baik daripada algoritma lain dari segi kecekapan masa, tetapi isihan gabungan harus dipilih apabila kestabilan perlu dipertimbangkan.

See all articles