快速排序并返回排序前的索引--Java

  实现该功能的方法为,只需要多声明一个数组存储排序索引即可,然后在实际排序的时候,索引数组和数组同时变更。

  需要注意的是,原本排序程序中的很多地方需要大改。

快速排序(不存储索引):

    private static void quickSort(int[] keys, int begin, int end) {
        if (begin >= 0 && begin < keys.length && end >= 0 && end < keys.length && begin < end) {
            int i = begin, j = end;
            int vot = keys[i];
            while (i != j) {
                while(i < j && keys[j] >= vot) j--;
                if(i < j) keys[i++] = keys[j];
                while(i < j && keys[i] <= vot)  i++;
                if(i < j) keys[j--] = keys[i];
            }
            keys[i] = vot;
            quickSort(keys, begin, j-1);
            quickSort(keys, i+1, end);
        }
    }

  由于需要存储索引数组,因此涉及到数组的初始化问题,而这又是一个递归程序,因此需要写一个函数调用该递归函数。在这个函数里面初始化索引数组,并返回排序后的索引作为函数返回结果:

    private static int[] quickSort(int[] keys) {
        int[] indices = new int[keys.length];
        for (int i = 0; i < keys.length; i++) {
            indices[i] = i;
        }
        quickSort(keys, 0, keys.length-1, indices);
        return indices;
    }

  然后原本的

void quickSort(int[] keys, int begin, int end)

  改为:

void quickSort(keys, 0, keys.length-1, indices)

  另外,排序程序里面的 keys[i++]=keys[j] 应该改掉了,完整函数如下,可以体会体会

    
    private static void quickSort(int[] keys, int begin, int end, int[] indices) {
        if (begin >= 0 && begin < keys.length && end >= 0 && end < keys.length && begin < end) {
            int i = begin, j = end;
            int vot = keys[i];
            int temp = indices[i];
            while (i != j) {
                while(i < j && keys[j] >= vot) j--;
                if(i < j) {
                    keys[i] = keys[j];
                    indices[i] = indices[j];
                    i++;
                }
                while(i < j && keys[i] <= vot)  i++;
                if(i < j) {
                    keys[j] = keys[i];
                    indices[j] = indices[i];
                    j--;
                }
            }
            keys[i] = vot;
            indices[i] = temp;
            quickSort(keys, begin, j-1, indices);
            quickSort(keys, i+1, end, indices);
        }
    }

排序

    public static void main(String[] args) {
        int[] arr = {10,7,2,4,3,8,9,19};
        System.out.println("----排序前----");
        System.out.println(Arrays.toString(arr));
        int[] index = quickSort(arr);
        System.out.println("----排序后----");
        System.out.println(Arrays.toString(arr));
        System.out.println(Arrays.toString(index));

    }

结果:

----排序前----
[10, 7, 2, 4, 3, 8, 9, 19]
----排序后----
[2, 3, 4, 7, 8, 9, 10, 19]
[2, 4, 3, 1, 5, 6, 0, 7]

  通过排序前的索引,能够找到数组排序前的位置。由于有的问题中排序只是为了解决问题而采取的一个手段,实际上并不需要排序,那么就需要找到数组排序之前的位置。

原文地址:https://www.cnblogs.com/zhaoke271828/p/14731184.html