【问题标题】:Sorting index of array using merge Sort使用合并排序对数组的索引进行排序
【发布时间】:2016-01-01 11:28:28
【问题描述】:

我试图使用合并排序对数组的索引进行排序。合并排序完美,最终答案完全正确,但我不确定为什么索引不能在正确的位置工作。我不想对数组进行排序,我只想对作为索引列表的 perm[] 数组进行排序。

为避免混淆,这里举个例子: perm 数组保存原始数组 nums[] 的初始索引(即 0 到 nums.length - 1)

我想根据 nums[] 数组中的数据移动 perm 数组中的索引,以便索引表示排序顺序。

For example :
Array -> (-1,9,-5,3,0)
Initial perm -> (0,1,2,3,4)
After sorting perm based on array - > (2,0,4,3,1)

这是我的代码:

import java.util.Arrays;

public class IndexSort {

    public boolean leq(Comparable u, Comparable v) {
        return u.compareTo(v) <= 0;
    }

    public void merge(Comparable a[], int temp[], int perm[], int lo, int mid, int hi) {
        int i = lo, j = mid + 1;

        for (int k = lo; k <= hi; k++) {
            temp[k] = perm[k];
        }

        for (int k = lo; k <= hi; k++) {
            if (i > mid) {
                perm[k] = temp[j++];
            } else if (j > hi) {
                perm[k] = temp[i++];
            } else if (leq(a[perm[i]], a[perm[j]])) {
                perm[k] = temp[i++];
            } else {
                perm[k] = temp[j++];
            }
        }
    }

    public void mergeSort(Comparable a[], int temp[], int perm[], int lo, int hi) {
        if (hi <= lo)
            return;
        int mid = (hi + lo) / 2;
        mergeSort(a, temp, perm, lo, mid);
        mergeSort(a, temp, perm, mid + 1, hi);
        merge(a, temp, perm, lo, mid, hi);
        System.out.println(" lo  = " + lo + "  mid  = " + mid + "  hi  = " + hi);
        System.out.println(Arrays.toString(perm));
    }

    public void indexSort(Comparable nums[], int perm[]) {
        int temp[] = new int[nums.length];
        Comparable temp2[] = new Comparable[nums.length];
        mergeSort(nums, temp, perm, 0, nums.length - 1);
    }

    public static void main(String[] args) {
        IndexSort o1 = new IndexSort();
        Comparable nums[] = { 12, -12, 0, 123, -123, 1, 2, 3, 4, -4, -4, -3, -2, 1 };
        int perm[] = new int[nums.length];
        for (int i = 0; i < perm.length; i++) {
            perm[i] = i;
        }
        System.out.println(Arrays.toString(nums));
        System.out.println(Arrays.toString(perm));
        o1.indexSort(nums, perm);
        System.out.println(Arrays.toString(perm));
    }
}

【问题讨论】:

  • "对数组的索引进行排序" ???虽然不是很清楚,但在我第二次阅读它时 - 似乎您想要对一个包含另一个数组索引的数组进行排序。这无关紧要,您想要对数组的内容进行排序,这就是它的全部内容。请尽量不要混淆想要帮助你的人...... :)
  • 您能否在回答您的问题输出并指出与您的预期不同的地方。
  • 对不起,如果有任何混淆,我现在在问题中添加了一个例子来说明我想要做什么。

标签: java mergesort divide-and-conquer


【解决方案1】:

我觉得这条线需要从perm改成temp

} else if (leq(a[temp[i]], a[temp[j]])) {

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 2014-01-14
    相关资源
    最近更新 更多