Arraylist<T>等实现自定义的排序算法

来源:互联网 发布:mackeeper说我mac中毒 编辑:程序博客网 时间:2024/06/05 16:43

考试的时候,本想到Arraylist可以自定义排序算法,可是忘记了返回值(当时看不了源码),后面只能自己写了个冒泡排序(效率太低了),现在说说如何自定义排序算法

import java.util.ArrayList;import java.util.Comparator;public class test {    public static void main(String[] args) {        // TODO Auto-generated method stub            ArrayList<Teacher>data= new ArrayList<Teacher>();            data.add(new Teacher("aaa", 3));            data.add(new Teacher("bbb", 1));            for(int i=0;i<data.size();i++){                System.out.println("老师名字为: "+data.get(i).name+"  老师的ID为: "+data.get(i).id);            }            data.sort(new Comparator<Teacher>() {                @Override                public int compare(Teacher o1, Teacher o2) {                    // TODO Auto-generated method stub                    if(o1.id>o2.id)return 1;                       //从大到小排列! 1代表需要排列                    else return -1;                }            });           for(int i=0;i<data.size();i++){                System.out.println("老师名字为: "+data.get(i).name+"  老师的ID为: "+data.get(i).id);            }    }}class Teacher{    public String name;    public int id;    public Teacher(String name,int id){        this.name=name;        this.id=id;    }}

最后的运行结果为
这里写图片描述
我在考试时一直以为0 和1 ,看来源码后发现是<0 这个判断条件,Comparator里面就是自己自定义的排序,从大到小还是从小到大,
下面是Arratlist.sort()采用的算法源码:

 @SuppressWarnings("fallthrough")    private static <T> void binarySort(T[] a, int lo, int hi, int start,                                       Comparator<? super T> c) {        assert lo <= start && start <= hi;        if (start == lo)            start++;        for ( ; start < hi; start++) {            T pivot = a[start];            // Set left (and right) to the index where a[start] (pivot) belongs            int left = lo;            int right = start;            assert left <= right;            /*             * Invariants:             *   pivot >= all in [lo, left).             *   pivot <  all in [right, start).             */            while (left < right) {                int mid = (left + right) >>> 1;                if (c.compare(pivot, a[mid]) < 0)                    right = mid;                else                    left = mid + 1;            }            assert left == right;            int n = start - left;  // The number of elements to move            // Switch is just an optimization for arraycopy in default case            switch (n) {                case 2:  a[left + 2] = a[left + 1];                case 1:  a[left + 1] = a[left];                         break;                default: System.arraycopy(a, left, a, left + 1, n);            }            a[left] = pivot;        }    }

其实就是快速排序算法。

原创粉丝点击