插入排序compareTo()

时间:2017-02-25 04:48:59

标签: java sorting compareto insertion

所以我有一个对象列表,我想根据对象的每个名称的特征进行排序(按字母顺序排列)。我们需要按字母顺序“粗略地”使用它,因此我认为这是插入排序算法的平庸实现。但是,我只能按字母顺序对一个项目进行排序。我已经在这几个小时了,似乎已经遇到了障碍。

public void sort(){
  int i=1;
  while(list[i]!=null) { //while there is an element in the array
    String one=list[i-1].getName(); //get the name of the "first object"
    String two=list[i].getName();  //get the name of the "second object"

    if(two.compareTo(one)==0){ // if equal move on 
      i++;
    }
    else if(two.compareTo(one)<0){// two is before one
      Contact temp =list[i-1];  //store this temporarily
      list[i-1]=list[i]; //swap them
      list[i]=temp; //put temp back where it belongs
      i++;  //check next elements
    }
    i++
  }
}

这是列表,排序之前和之后的内容...... http://image.prntscr.com/image/698cf44309ee43c29532ebe71a4925fe.png

3 个答案:

答案 0 :(得分:0)

首先,您必须了解插入排序的工作原理。

  • 您从列表中未分类的一半(O(n))
  • 中选择一个元素
  • 尝试将新挑选的元素插入列表的排序部分(O(n))

因此,插入排序为O(n ^ 2),这意味着它至少需要一个嵌套循环。

以下是修改后的版本:

    int i = 1;
    while(list[i] != null) {
        // i divides sorted and unsorted
        // try to insert i to the right place, so loop j from i-1 to 0
        int j = i;
        while (j > 0) {
            String one = list[j-1].getName();
            String two = list[j].getName();
            int cmp = one.compareTo(two);
            if (cmp <= 0) {
                break;
            }
            Contact temp = list[j-1];
            list[j-1] = list[j];
            list[j] = temp;
            --j;
        }
        ++i;
    }

答案 1 :(得分:0)

实现插入排序的方法有很多种。我将向您解释一种更简单的方法,通过该方法可以按照您的解释按名称对对象数组进行排序。 插入排序的关键属性是:

  1. 插入排序从他离开数组的末尾开始并前进到 右。

  2. 此排序机制不会查看右侧的元素, 而是专注于当前遇到的项目并拖回 该项目是正确的位置。

  3. 让我们记住这些事情的代码!!

        /*
         * Performs Insertion sort on given array of contacts!!
         */
        public static Contact[] sortContacts(Contact[] contacts){
            int n = contacts.length;
            // Advance the pointer to right
            for(int i = 0; i < n; i++){
                /*
                 * Compare current item with previous item.
                 * If current item is not in it's correct position,
                 * swap until it's dragged back to it's correct position.
                 * (Ascending order!!) 
                 */
                for(int j = i; j > 0; j--){
                    if(less(contacts[j], contacts[j - 1])){
                        swap(contacts, j, j - 1);
                    }else{
                        break;
                    }
                }
            }
    
            return contacts;
    
        }
    
        private static boolean less(Contact a, Contact b){
            return a.getName().compareTo(b.getName()) < 0;
        }
    
        private static void swap(Contact[] contacts, int i, int j){
            Contact temp = contacts[i];
            contacts[i] = contacts[j];
            contacts[j] = temp;
        }
    

    这三种方法有助于您的排序!!

    现在要测试它,让我们创建一些联系人并对它们进行排序!!

            Contact one = new Contact();
            one.setName("tony");
            one.setPhone("6666");
            one.setMail("kkk@lll.com");
    
            Contact two = new Contact();
            two.setName("steve");
            two.setPhone("777");
            two.setMail("rrr@mmm.com");
    
            Contact three = new Contact();
            three.setName("clint");
            three.setPhone("333");
            three.setMail("ggg@sss.com");
    
            Contact four = new Contact();
            four.setName("bruce");
            four.setPhone("222");
            four.setMail("bbb@ccc.com");
    

    让我们排序:

    Contact[] res = Insertion.sortContacts(new Contact[]{one,two,three,four});
    for(Contact c : res){
            System.out.println(c);
        }
    

    这会产生输出:

    Contact [name=bruce, mail=bbb@ccc.com, phone=222]
    Contact [name=clint, mail=ggg@sss.com, phone=333]
    Contact [name=steve, mail=rrr@mmm.com, phone=777]
    Contact [name=tony, mail=kkk@lll.com, phone=6666]
    

    根据每个联系人的姓名排序! 我希望这是你想要实现的目标

答案 2 :(得分:-1)

您可以在课堂上使用interface Comparable

示例:

public class Contact implements Comparable<Contact> 

    // ...

    public int compareTo(Contact other) {
       return getName().compareTo(other.getName());
    }
}

然后,如果list是一个数组:

Arrays.sort(list);