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); } } } } }
其实编程就是思路,有了思路一切都好说。