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]