Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入排序比较()_Java_Sorting_Compareto_Insertion - Fatal编程技术网

Java 插入排序比较()

Java 插入排序比较(),java,sorting,compareto,insertion,Java,Sorting,Compareto,Insertion,因此,我有一个对象列表,我想根据对象每个名称的特征(按字母顺序)进行排序。我们需要按字母顺序“大致”排列,所以我认为插入排序算法的实现一般。但是,我只能按字母顺序对一个项目进行正确排序。我已经做了几个小时了,似乎遇到了障碍 public void sort(){ int i=1; while(list[i]!=null){//当数组中有一个元素时 String one=list[i-1].getName();//获取“第一个对象”的名称 String two=list[i].getName()

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

public void sort(){
int i=1;
while(list[i]!=null){//当数组中有一个元素时
String one=list[i-1].getName();//获取“第一个对象”的名称
String two=list[i].getName();//获取“第二个对象”的名称
如果(2.compareTo(1)==0{//如果相等,则继续
i++;
}

否则如果(两个)与(一个)相比,您可以为您的类使用
接口compariable

例如:

public class Contact implements Comparable<Contact> 

    // ...

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

首先,您必须了解插入排序是如何工作的

  • 您可以从列表的未排序的一半(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;
    }
inti=1;
while(列表[i]!=null){
//我把分类的和未分类的分开
//尝试将i插入到正确的位置,使j从i-1循环到0
int j=i;
而(j>0){
字符串一=列表[j-1].getName();
字符串二=列表[j].getName();
int cmp=1。与(2)相比;

if(cmp有很多方法可以实现插入排序。我将向您介绍一种更简单的方法,您可以按照前面介绍的名称对对象数组进行排序。 插入排序的关键属性是:

  • 插入排序从数组的左端开始,前进到 对

  • 此排序机制不会查看右侧的元素, 相反,它关注当前遇到的项目并将其拖回 把那个东西放在正确的位置上

  • 让我们把这些事情牢记在心

        /*
         * 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[] 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]
    
    根据每个联系人的姓名进行排序!!
    我希望这就是你想要实现的

    谢谢,但我不熟悉这一点,我们必须按照我最初尝试的方式来做,没有什么特别之处:)@PhilpAdoni什么类型的列表?它是contact Objects我的意思是,它是数组还是类似ArrayList的东西?它是数组!我们不能在这里使用列表,也许这会让它更清楚一点…我真的让堆栈溢出社区难住了吗:我想你是这样做的。你把关键的信息位从你的问题中漏掉了,让每个人都猜,一个d Stack Overflow社区中的一些人猜错了。如果你想把这看作是在愚弄社区,我不能阻止你。没有区别,我害怕:我用你的例子运行了它。至少它对我有效。我的联系人顺序是:Alex Bob Fred John Stevehmm。那么你是如何看待他们的?我看不出它怎么对我无效@PhilpAdoni示例中的前两个元素后面有一个
    空的
    。我不知道这是什么意思,因为您没有向我们展示打印输出的方法。但是如果它意味着
    列表[2]
    null
    ,则您的原始代码使其看起来像是数组的结尾。这与Xin的假设相同。如果数组中的
    null
    表示其他内容,您需要让我们知道发生了什么。@PhilpAdoni,请不要使用.png或其他图像发布您的输出,y我们的程序,或任何其他可以作为文本包含在您的问题中的内容。
    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]