Heim >Java >javaLernprogramm >Ausführliche Erläuterung von Beispielen für die Zusammenführungssortierung (nicht rekursiv) der Java-Vergleichssortierung

Ausführliche Erläuterung von Beispielen für die Zusammenführungssortierung (nicht rekursiv) der Java-Vergleichssortierung

PHP中文网
PHP中文网Original
2017-06-28 12:32:032179Durchsuche

Im vorherigen Abschnitt haben wir die rekursive Version der Zusammenführungssortierung erklärt: „4. Vergleichende Sortierung – Zusammenführungssortierung (rekursiv)“. rekursive Version der Merge-Sortierung. Die Idee ist die gleiche wie bei der rekursiven Version, bei der zuerst zerlegt und dann zusammengeführt wird. Der Schwerpunkt der Nicht-Rekursion liegt auf der Bestimmung und sinnvollen Zerlegung des zu sortierenden Arrays.

Bei Nicht-Rekursion erfolgt die Segmentierung nicht von groß nach klein in Rekursionsrichtung. Bei Nicht-Rekursion beginnt die Segmentierung tatsächlich von klein nach groß, wenn der Algorithmus von Anfang an erstellt wird.

Bestimmen Sie beim ersten Segmentieren und Sortieren, dass die Mindesteinheit 1 Zahl ist, und kombinieren Sie 2 Zahlen zu einer Gruppe.

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++];
        }
    }
}

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die Zusammenführungssortierung (nicht rekursiv) der Java-Vergleichssortierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn