Rumah Java javaTutorial java比较排序之归并排序(非递归)实例详解

java比较排序之归并排序(非递归)实例详解

Jun 28, 2017 pm 12:32 PM
menyusun Bandingkan rekursi

在上一节中讲解了归并排序的递归版《4.比较排序之归并排序(递归)》,通常来讲,递归版的归并排序要更为常用,本节简单介绍下非递归版的归并排序。思路和递归版相同,均为先分解后合并,非递归的重点在于如何确定并合理的分解待排序数组。

 对于非递归来讲,切分的不向递归从大到小,非递归实际上从一开始构建算法的时候都从小到大。

  第一次切分排序就确定最小单位为1个数字,将2个数字组合为一组。

package com.algorithm.sort.mergenonrecursive;
import java.util.Arrays;
/**
 * 归并排序(非递归)
 * Created by yulinfeng on 2017/6/24.
 */
public class Merge {
    public static void main(String[] args) {
        int[] nums = {6, 5, 3, 1, 7, 2, 4};
        nums = mergeSort(nums);
        System.out.println(Arrays.toString(nums));
    }
    /**
     * 归并排序(非递归)
     * 从切分的数组长度为1开始,一次归并变回原来长度的2倍
     * @param nums 待排序数组
     * @return 排好序的数组
     */
    private static int[] mergeSort(int[] nums) {
        int len = 1;
        while (len <= nums.length) {
            for (int i = 0; i + len <= nums.length; i += len * 2) {
                int low = i, mid = i + len - 1, high = i + 2 * len - 1;
                if (high > nums.length - 1) {
                    high = nums.length - 1; //整个待排序数组为奇数的情况
                }
                merge(nums, low, mid, high);
            }
            len *= 2;
        }
        return nums;
    }
    /**
     * 将切分的数组进行归并排序,同递归版
     * @param nums 带排序数组
     * @param low 左边数组第一个元素索引
     * @param mid 左边数组最后一个元素索引,mid + 1为右边数组第一个元素索引
     * @param high 右边数组最后一个元素索引
     */
    private static void merge(int[] nums, int low, int mid, int high) {
        int[] tmpArray = new int[nums.length];
        int rightIndex = mid + 1;
        int tmpIndex = low;
        int begin = low;
        while (low <= mid && rightIndex <= high) {
            if (nums[low] <= nums[rightIndex]) {
                tmpArray[tmpIndex++] = nums[low++];
            } else {
                tmpArray[tmpIndex++] = nums[rightIndex++];
            }
        }
        while (low <= mid) {
            tmpArray[tmpIndex++] = nums[low++];
        }
        while (rightIndex <= high) {
            tmpArray[tmpIndex++] = nums[rightIndex++];
        }
        while (begin <= high) {
            nums[begin] = tmpArray[begin++];
        }
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci java比较排序之归并排序(非递归)实例详解. 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)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu 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)

Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Pelaksanaan rekursif fungsi C++: Adakah terdapat had untuk kedalaman rekursif? Apr 23, 2024 am 09:30 AM

Kedalaman rekursi fungsi C++ adalah terhad, dan melebihi had ini akan mengakibatkan ralat limpahan tindanan. Nilai had berbeza antara sistem dan penyusun, tetapi biasanya antara 1,000 dan 10,000. Penyelesaian termasuk: 1. Pengoptimuman rekursi ekor; 2. Panggilan ekor;

Adakah ungkapan lambda C++ menyokong rekursi? Adakah ungkapan lambda C++ menyokong rekursi? Apr 17, 2024 pm 09:06 PM

Ya, ungkapan Lambda C++ boleh menyokong rekursi dengan menggunakan std::function: Gunakan std::function untuk menangkap rujukan kepada ungkapan Lambda. Dengan rujukan yang ditangkap, ungkapan Lambda boleh memanggil dirinya secara rekursif.

Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Pelaksanaan rekursif fungsi C++: Analisis perbandingan algoritma rekursif dan bukan rekursif? Apr 22, 2024 pm 03:18 PM

Algoritma rekursif menyelesaikan masalah berstruktur melalui fungsi panggilan kendiri Kelebihannya ialah ia mudah dan mudah difahami, tetapi kelemahannya ialah ia kurang cekap dan boleh menyebabkan limpahan timbunan Algoritma bukan rekursif mengelakkan pengulangan dengan menguruskan secara eksplisit struktur data timbunan Kelebihannya ialah ia lebih cekap dan mengelakkan limpahan, kelemahannya ialah kod itu mungkin lebih kompleks. Pilihan rekursif atau bukan rekursif bergantung kepada masalah dan kekangan khusus pelaksanaan.

Institut Penyelidikan TrendX: Analisis projek Rantaian Merlin dan inventori ekologi Institut Penyelidikan TrendX: Analisis projek Rantaian Merlin dan inventori ekologi Mar 24, 2024 am 09:01 AM

Menurut statistik pada 2 Mac, jumlah TVL rangkaian lapisan kedua Bitcoin MerlinChain telah mencecah AS$3 bilion. Antaranya, aset ekologi Bitcoin menyumbang 90.83%, termasuk BTC bernilai AS$1.596 bilion dan aset BRC-20 bernilai AS$404 juta. Bulan lalu, jumlah TVL MerlinChain mencecah AS$1.97 bilion dalam tempoh 14 hari selepas melancarkan aktiviti mempertaruhkan, mengatasi Blast, yang dilancarkan pada November tahun lepas dan juga yang paling terkini dan sama menarik perhatian. Pada 26 Februari, jumlah nilai NFT dalam ekosistem MerlinChain melebihi AS$420 juta, menjadi projek rantaian awam dengan nilai pasaran NFT tertinggi selain Ethereum. Pengenalan Projek MerlinChain ialah sokongan OKX

Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Penjelasan terperinci tentang rekursi fungsi C++: aplikasi rekursi dalam pemprosesan rentetan Apr 30, 2024 am 10:30 AM

Fungsi rekursif ialah teknik yang memanggil dirinya berulang kali untuk menyelesaikan masalah dalam pemprosesan rentetan. Ia memerlukan syarat penamatan untuk mengelakkan rekursi tak terhingga. Rekursi digunakan secara meluas dalam operasi seperti pembalikan rentetan dan pemeriksaan palindrom.

Panduan pemula untuk rekursi C++: Membina asas dan membangunkan intuisi Panduan pemula untuk rekursi C++: Membina asas dan membangunkan intuisi May 01, 2024 pm 05:36 PM

Rekursif ialah teknik berkuasa yang membolehkan fungsi memanggil dirinya sendiri untuk menyelesaikan masalah Dalam C++, fungsi rekursif terdiri daripada dua elemen utama: kes asas (menentukan apabila rekursif berhenti) dan panggilan rekursif (memecahkan masalah kepada sub yang lebih kecil. -masalah). Dengan memahami asas dan mempraktikkan contoh praktikal seperti pengiraan faktorial, jujukan Fibonacci dan traversal pokok binari, anda boleh membina gerak hati rekursif anda dan menggunakannya dalam kod anda dengan yakin.

Rekursi fungsi C++ dijelaskan: alternatif kepada rekursi Rekursi fungsi C++ dijelaskan: alternatif kepada rekursi May 01, 2024 pm 04:54 PM

Rekursi ialah teknik di mana fungsi memanggil dirinya sendiri, tetapi mempunyai kelemahan limpahan tindanan dan ketidakcekapan. Alternatif termasuk: pengoptimuman rekursif ekor, di mana pengkompil mengoptimumkan panggilan rekursif ke dalam gelung, yang menggunakan gelung dan bukannya rekursi, yang membolehkan pelaksanaan dijeda dan disambung semula, mensimulasikan tingkah laku rekursif.

C++ Recursion Advanced: Memahami Pengoptimuman Rekursi Ekor dan Aplikasinya C++ Recursion Advanced: Memahami Pengoptimuman Rekursi Ekor dan Aplikasinya Apr 30, 2024 am 10:45 AM

Pengoptimuman rekursif ekor (TRO) meningkatkan kecekapan panggilan rekursif tertentu. Ia menukarkan panggilan rekursif ekor kepada arahan lompat dan menyimpan keadaan konteks dalam daftar dan bukannya pada tindanan, dengan itu menghapuskan panggilan tambahan dan operasi kembali kepada tindanan dan meningkatkan kecekapan algoritma. Menggunakan TRO, kita boleh mengoptimumkan fungsi rekursif ekor (seperti pengiraan faktorial dengan menggantikan panggilan rekursif ekor dengan pernyataan goto, pengkompil akan menukar lompatan goto kepada TRO dan mengoptimumkan pelaksanaan algoritma rekursif).

See all articles