• 04-经典排序案例


    实现一个快速排序  将接口对象作为类属性

    //: Compare.java
    // Interface for sorting callback:
    package c08;
    
    interface Compare {
        boolean lessThan(Object lhs, Object rhs);
    
        boolean lessThanOrEqual(Object lhs, Object rhs);
    } // /:~

    排序的实现:

    //: SortVector.java
    // A generic sorting vector
    package c08;
    
    import java.util.*;
    
    public class SortVector extends Vector {
        private Compare compare; // To hold the callback
    
        public SortVector(Compare comp) {
            compare = comp;
        }
    
        public void sort() {
            quickSort(0, size() - 1);
        }
        //  4 5
        private void quickSort(int left, int right) {
            if (right > left) {
                Object o1 = elementAt(right);
                int i = left - 1; //3
                int j = right;  //5
                while (true) {
                    while (compare.lessThan(elementAt(++i), o1))
                        ;
                    while (j > 0)
                        if (compare.lessThanOrEqual(elementAt(--j), o1))
    
                            break; // out of while
                    if (i >= j)
                        break;
                    swap(i, j);
                }
                swap(i, right);
                quickSort(left, i - 1);
                quickSort(i + 1, right);
            }
        }
        /**
         * 数据交换位置
         * @param loc1
         * @param loc2
         */
        private void swap(int loc1, int loc2) {
            Object tmp = elementAt(loc1);  //获取loc1位置的数据
            setElementAt(elementAt(loc2), loc1);  //将loc2位置的数据放置在loc1上
            setElementAt(tmp, loc2); //将原loc1上的数据放在loc2上
        }
    } // /:~

    测试案例(需要实现排序的具体规则)

    //: StringSortTest.java
    // Testing the generic sorting Vector
    package c08;
    
    import java.util.*;
    
    public class StringSortTest {
        static class StringCompare implements Compare {
            public boolean lessThan(Object l, Object r) {
                return ((String) l).toLowerCase().compareTo(
                        ((String) r).toLowerCase()) < 0;
            }
    
            public boolean lessThanOrEqual(Object l, Object r) {
                return ((String) l).toLowerCase().compareTo(
                        ((String) r).toLowerCase()) <= 0;
            }
        }
    
        public static void main(String[] args) {
            SortVector sv = new SortVector(new StringCompare());
            sv.addElement("d");
            sv.addElement("A");
            sv.addElement("C");
            sv.addElement("c");
            sv.addElement("b");
            sv.addElement("B");
            sv.addElement("D");
            sv.addElement("a");
            sv.sort();
            Enumeration e = sv.elements();
            while (e.hasMoreElements())
    
                System.out.println(e.nextElement());
        }
    } // /:~

    可以通过匿名内部类来实现:

    //: StrSortVector.java
    // Automatically sorted Vector that
    // accepts and produces only Strings
    package c08;
    
    import java.util.*;
    
    public class StrSortVector {
        private SortVector v = new SortVector(
        // Anonymous inner class:
                new Compare() {
                    public boolean lessThan(Object l, Object r) {
                        return ((String) l).toLowerCase().compareTo(
                                ((String) r).toLowerCase()) < 0;
                    }
    
                    public boolean lessThanOrEqual(Object l, Object r) {
                        return ((String) l).toLowerCase().compareTo(
                                ((String) r).toLowerCase()) <= 0;
                    }
                });
        private boolean sorted = false; //增加新的元素以后需要重新排序
    
        public void addElement(String s) {
            v.addElement(s);
            sorted = false;
        }
    
        public String elementAt(int index) {
            if (!sorted) {
                v.sort();
    
                sorted = true;
            }
            return (String) v.elementAt(index);
        }
    
        public Enumeration elements() {
            if (!sorted) {
                v.sort();
                sorted = true;
            }
            return v.elements();
        }
    
        // Test it:
        public static void main(String[] args) {
            StrSortVector sv = new StrSortVector();
            sv.addElement("d");
            sv.addElement("A");
            sv.addElement("C");
            sv.addElement("c");
            sv.addElement("b");
            sv.addElement("B");
            sv.addElement("D");
            sv.addElement("a"); 
             
            
            Enumeration e = sv.elements();
            while (e.hasMoreElements())
                System.out.println(e.nextElement());
        }
    } // /:~
  • 相关阅读:
    luogu3242 接水果 (整体二分+树状数组)
    [BZOJ3449] [Usaco2014 Feb]Secret Code
    [BZOJ2821] 作诗(Poetize)
    [BZOJ2434] [Noi2011]阿狸的打字机
    [BZOJ1212] [HNOI2004]L语言
    [JZOJ100026]【NOIP2017提高A组模拟7.7】图
    [BZOJ2467] [中山市选2010]生成树
    [Luogu3868] [TJOI2009]猜数字
    [POJ1006] Biorhythms
    [BZOJ2733] [HNOI2012]永无乡
  • 原文地址:https://www.cnblogs.com/liaokailin/p/3673399.html
Copyright © 2020-2023  润新知