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