如何以排序的形式存储int数组的原始索引?

时间:2018-02-16 09:32:36

标签: java arrays sorting

我希望存储数组元素的原始索引号,然后按升序排序。

假设数组中的元素是

x [] = {20,40,70,80,50,30};

我希望另一个数组返回带有排序形式的索引号,如

排序[] = {0,5,1,4,2,3}

我多次尝试过。但无法弄清楚如何获得索引号。每次交换后索引号都会改变。

注意:

  • 我不能使用comparotor,map,Arrays.sort或类似的东西。我有 仅使用循环。
  • 我已经搜索了所有网站。我找不到任何具体的答案。 因为他们都使用比较器地图或我不是的东西 现在允许使用。

    public static int[] sort(int[] numbers) {
        int[] sorted = new int[numbers.length];
        int temp;
        int[] index= new int[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            for (int j = i+1; j < numbers.length; j++) {
                if (numbers[i] > numbers[j]) {
                    temp = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = temp;
                    index[i]= j;
                }
            }
        }
        return index;
    }
    

3 个答案:

答案 0 :(得分:1)

我能够通过将原始数组存储在另一个数组中然后使用循环来比较已排序的数组并存储索引来实现。

感谢@RubioRic @RCInd。

答案 1 :(得分:0)

我认为这就是你要找的东西:

  
      
  1. 在地图中保留位置
  2.   
  3. 排序
  4.   
  5. 在排序之前查找索引的映射   PS:由于重复,复杂性将会出现。你需要处理   在另一张地图的帮助下
  6.         

    请在此处查看工作代码......

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.print.attribute.HashAttributeSet;

public class PositionFinder{


    public static void main(String[] args) {
        Integer []a = {3,2,3,0,1};
        Map <Integer , List<Integer>> map = new HashMap<>();

        for (int i = 0; i < a.length; i++) {
            int j = a[i];
            if(map.get(j)==null){
                map.put(j, new ArrayList<>());
                map.get(j).add(i);
            }
            else{
                map.get(j).add(i);
            }
        }

        System.out.println("Positions ->" + map);

        //sort
        List<Integer> l = new ArrayList<Integer>(Arrays.asList(a));

        Collections.sort(l);

        System.out.println("Sorted List -->" + l );


        //get and print index
        List positionList = new ArrayList<>();
        Map<Integer, Integer> duplicateTrackerMap = new HashMap<>();
        for (Integer key : l) {
            int pos = 0;
            if(duplicateTrackerMap.get(key) != null){
                pos = 1+ duplicateTrackerMap.get(key);

            }
            duplicateTrackerMap.put(key, pos);
            positionList.add(map.get(key).get(pos));
        }
        System.out.println("Sort index -->" +  positionList);
    }


}

答案 2 :(得分:0)

    int x[] = { 20, 40, 70, 80, 50, 30 };
    int[] array = new int[x.length];
    for (int i = 0; i < x.length; i++) {
        array[i] = i;
    }
    for (int i = (x.length - 1); i >= 0; i--) {
        for (int j = 1; j <= i; j++) {
            int oneMi = j - 1;
            if (x[oneMi] > x[j]) {
                int temp = x[oneMi];
                x[oneMi] = x[j];
                x[j] = temp;
                int swi = array[oneMi];
                array[oneMi] = array[j];
                array[j] = swi;
            }
        }
    }

    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }