3.详解桶排序以及排序内容大总结_哔哩哔哩_bilibili
优先级队列:
java提供有PriorityQueue类,如果没有提供优先级队列,例如c语言,需要先创建优先级队列,按需求创建的优先级队列通常效率更高。
默认创建priority对象数据结构为最小堆,调用poll()方法会从小到大输出。
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); priorityQueue.add(1); priorityQueue.add(10); priorityQueue.add(12); priorityQueue.add(5); priorityQueue.add(3); while(!priorityQueue.isEmpty()){ System.out.println(" priorityQueue.poll() = " + priorityQueue.poll()); }
PriorityQueue实现泛型Student,需要对相应类型Student定义比较器
PriorityQueue<Student> studentPriorityQueue = new PriorityQueue<>(new Comparator<Student>(){ @Override public int compare(Student o1, Student o2) { return o1.getId()-o2.getId(); } }); Student[] students = new Student[3]; Student student1 = new Student(10,2); Student student2 = new Student(4,12); Student student3 = new Student(9,22); students[0] = student1; students[1] = student2; students[2] = student3; studentPriorityQueue.add(student1); studentPriorityQueue.add(student2); studentPriorityQueue.add(student3); System.out.println(studentPriorityQueue);
比较器:
重写Comparator类的compare方法,
返回值为负数,前者排在前面。
返回值为正数,后者排在前面。
Student[] students = new Student[3]; Student student1 = new Student(10,2); Student student2 = new Student(4,12); Student student3 = new Student(9,22); students[0] = student1; students[1] = student2; students[2] = student3; Arrays.sort(students,new Comparator<Student>(){ @Override public int compare(Student o1, Student o2) { return o1.getId()-o2.getId(); } }); Arrays.stream(students).forEach(new Consumer<Student>() { @Override public void accept(Student student) { System.out.println("student = " + student); } });
桶排序:
数组实现按个十百位排序,优先比较百位,次优先级为十位,如果百位十位值一样最后看个位。
例如数组:
【113,142,414,514,114,213】,
数组排序的结果为 :
【113,114,142,213,414,514】
radixSort(int [ ] arr):
提高效率,如果数组不合法或者不用排序直接返回不用排序。
maxbits():
找最大位数d
radixSort()方法:
从优先级最小的个位d开始排序,位数每次加1,直到优先级最大,位数最大的d最后排序。
每一次排序都实现了在相应d位上的有序。
getDigit():
拆出相应d位上的数。