zoukankan      html  css  js  c++  java
  • 快速排序并返回排序前的索引--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]

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

  • 相关阅读:
    CSS使用规则总结
    python虚拟机内存泄露?
    对象内存池
    由引擎接口自顶向下的设计引擎结构
    【译】Lesson 0: 开始学习WebGL
    【译】Lesson 1: 一个三角形和一个方块
    网盘中搭建git服务
    行为树(Behavior Tree)
    显卡参数大全
    VTune 备忘
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/14731184.html
Copyright © 2011-2022 走看看