首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何对数组进行排序(索引),以使用这些索引从最小值到最大值对原始数组进行排序

如何对数组进行排序(索引),以使用这些索引从最小值到最大值对原始数组进行排序
EN

Stack Overflow用户
提问于 2018-09-16 22:11:25
回答 5查看 869关注 0票数 3

例如,我有这样的数组

代码语言:javascript
复制
int[] a = {6,10,16,11,7,12,3,9,8,5};

我想像这样对它的索引进行排序

代码语言:javascript
复制
[6,9,0,4,8,7,1,3,5,2]

所以我可以使用索引从最小到最大值对a进行排序。在我的代码中,我得到了以下代码

代码语言:javascript
复制
[6, 9, 4, 8, 7, 4, 5, 6, 6, 6] 

这是我的代码

代码语言:javascript
复制
int[] a = {6,10,16,11,7,12,3,9,8,5};
int[] indeks = indekssortering(a);
System.out.println(Arrays.toString(indeks));

public static int[] indekssortering(int[] a){
    int[] indeks = new int[a.length];
    int m = 0;
    boolean finnes = false;
    boolean nyVerdi = false;
    int n = 0;
    for (int j = 0; j < a.length; j++) {
        for (int i = m+1; i < a.length ; i++) {
            if(a[m] > a[i]){
                for (int k = 0; k < j; k++) {
                    if(indeks[k] == i) finnes = true; //check if the same position is saved before
                }
                if(!finnes){ // if not so its the next minimum value
                    m = i;
                } else {
                    nyVerdi = true; // if didnt find match then the value used to compare is the next minimum
                }
            }
            finnes = false;
        }
        indeks[j] = m;
        if(nyVerdi) n=n+1;
        nyVerdi = false;
        m=0+n;
    }
    return indeks;
}

我需要帮助,使这个代码的工作,或找到一个比这更好的想法。

我想要做的是。将所有值与第一个值进行比较,获取最小值并将位置保存到数组(indeks)中。在保存之前,我做了for循环,检查这个位置以前是否被添加过。如果没有比用于比较的值更大的值,这意味着它是下一个较小的值。我把它们中的一些做对了,另一些做错了。我认为我需要改变这个想法,找到一个更好的解决方案。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-09-16 22:46:52

这里是一个经典的bubble sort algorithm实现,经过修改可以对索引进行排序

实际上,您正在寻找的是对int [] array进行排序的任何排序算法。这是互联网上无尽的实现列表。然后将比较结果更改为result中的array[result[i]]和交换值,而不是array中的交换值。

代码语言:javascript
复制
static int[] sort(int[] array) {
    final int size = array.length;

    final int[] result = new int[size];
    for (int i = 0; i < size; i++)
        result[i] = i;

    boolean sorted;
    do {
        sorted = true;
        int bubble = result[0];
        for (int i = 0; i < size - 1; i++) {
            if (array[bubble] > array[result[i + 1]]) {
                result[i] = result[i + 1];
                result[i + 1] = bubble;
                sorted = false;
            } else {
                bubble = result[i + 1];
            }
        }
    } while (!sorted);

    return result;
}

result arrays for your input data is [6, 9, 0, 4, 8, 7, 1, 3, 5, 2]
票数 3
EN

Stack Overflow用户

发布于 2018-09-16 22:24:26

这是一个没有Java 8 Stream API和有Java 8 Stream API的解决方案。

代码语言:javascript
复制
import java.util.*;
import java.util.stream.IntStream;

public class SortIndices {

    static class Indexed {
        private final int number;
        private final int index;

        Indexed(int number, int index) {
            this.number = number;
            this.index = index;
        }

        public int getNumber() {
            return number;
        }

        public int getIndex() {
            return index;
        }
    }

    static int[] indexesSorted(int[] input) {
        // Without using Stream API
        List<Indexed> indexed = new ArrayList<>();
        for(int i = 0; i < input.length; ++i) {
            indexed.add(new Indexed(input[i], i));
        }
        Collections.sort(indexed, Comparator.comparing(it -> it.number));
        int[] result = new int[indexed.size()];
        for(int i = 0; i < input.length; ++i) {
            result[i] = indexed.get(i).index;
        }
        return result;
        // Using Stream API
        /*return IntStream.range(0, input.length)
                .mapToObj(i -> new Indexed(input[i], i))
                .sorted(Comparator.comparing(it -> it.number))
                .mapToInt(it -> it.index)
                .toArray();*/
    }

    public static void main(String[] args) {
        int[] result = indexesSorted(new int[]{6, 10, 16, 11, 7, 12, 3, 9, 8, 5});
        System.out.println(Arrays.toString(result));
    }
}

如果不能使用Java8,可以在Indexed上实现Comparable接口

代码语言:javascript
复制
    static class Indexed implements Comparable<Indexed> {
        private final int number;
        private final int index;

        Indexed(int number, int index) {
            this.number = number;
            this.index = index;
        }

        public int getNumber() {
            return number;
        }

        public int getIndex() {
            return index;
        }

        @Override
        public int compareTo(Indexed o) {
            return Integer.compare(number, o.number);
        }
    }

然后调用不带第二个参数的Collections.sort

票数 3
EN

Stack Overflow用户

发布于 2018-09-17 00:14:26

如果indexOf(int[], int)的库(如Guava)可用,您可以很容易地获得它:

代码语言:javascript
复制
int[] a = { 6, 10, 16, 11, 7, 12, 3, 9, 8, 5 };
int[] b = Arrays.copyOf(a, a.length);
Arrays.sort(b);
Arrays.setAll(b, i -> indexOf(a, b[i])); // b = [6, 9, 0, 4, 8, 7, 1, 3, 5, 2]

如果没有可用的库,下面是一个indexOf(int[], int)实现:

代码语言:javascript
复制
public static int indexOf(int[] array, int search) {
    for (int i = 0; i < array.length; i++) {
        if (array[i] == search) {
            return i;
        }
    }
    return -1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52354956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档