个人实现---多级排序

liuyang000 2020-04-25

写过SQL的都知道,有个Order By排序功能,这个Order By不仅能根据一个元素进行排序,还能同时根据多个元素进行排序。

你有没有好奇是怎么实现多个元素排序的呢?小编是很好奇。单个元素排序很简单,直接冒泡就行了,那么多个怎么实现呢?难道要写多个冒泡么?

带着疑问,开始了构思。最终大道至简,可以把多个元素拼接成一个大的元素进行比对,这样用一个冒泡就完成了多个元素排序。是不是豁然开朗。

其实很多问题都是可以分分合合的,最终就是为了计算。比如搞分布式就是为了分,方便每个节点进行计算。使用shuffling进行拉取,方便进行统一计算。

好了,扯得有点多了,下面上代码(这个是Java版的,道理是一样的,你可以翻译成其它语言):

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

public class Test {

    public static void main(String[] args) {

        // 构建数据
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        list.add(Arrays.asList(1, 3, 4, 5));
        list.add(Arrays.asList(1, 2, 4, 6));
        list.add(Arrays.asList(4, 1, 7, 8));
        list.add(Arrays.asList(3, 5, 7, 9));
        list.add(Arrays.asList(2, 5, 7, 9));
        list.add(Arrays.asList(4, 1, 6, 8));

        // 设置通过前两个数据进行排序,索引设置索引1
        SortMultiple(list, 1);

        for (List<Integer> l : list) {
            System.out.println(l);
        }
        //排序结果如下:
        // [1, 2, 4, 6]
        // [1, 3, 4, 5]
        // [2, 5, 7, 9]
        // [3, 5, 7, 9]
        // [4, 1, 7, 8]
        // [4, 1, 6, 8]
    }

    /**
     * 多级排序-通过冒泡实现
     * Demo数据:"1,3,4,5","1,2,4,6","4,1,7,8","3,5,7,9","2,5,7,9","4,1,6,8" 思路:
     * 上面的数据可以排列成一个矩阵。 "1,3,4,5" "1,2,4,6" "4,1,7,8" "3,5,7,9" "2,5,7,9" "4,1,6,8"
     * 将对比的每个元素根据具体的位,拼接成一个数据。然后根据数据进行对比。 对比交换时,对两个List整体进行交换。
     * 比如根据前两位进行对比12小于13,那么交换时交换"1,3,4,5"和"1,2,4,6"
     * 
     * @param list设置要对比的元素。
     * @param index是索引,设置通过前几个元素排序。比如前2个元素,那么index就设置1,前一个元素,那index就设置0.
     */
    public static void SortMultiple(List<List<Integer>> list, int index) {

        for (int i = 0; i < list.size(); i++) {

            for (int j = i + 1; j < list.size(); j++) {
                double bNumSum = 0;// 前一个数据
                for (int bNum = index; bNum >= 0; bNum--) {
                    bNumSum += list.get(i).get(index - bNum).doubleValue() * Math.pow(10, bNum);

                }

                double eNumSum = 0;// 后一个数据
                for (int eNum = index; eNum >= 0; eNum--) {
                    eNumSum += list.get(j).get(index - eNum).doubleValue() * Math.pow(10, eNum);
                }

                if (eNumSum < bNumSum) {// 此处是按照升序排序,如果降序的话改为>即可。
                    List<Integer> chi = list.get(i);
                    List<Integer> chj = list.get(j);
                    list.set(j, chi);
                    list.set(i, chj);
                }

            }
        }

    }

}

其实编程就是思路,有了思路一切都好说。 

相关推荐