使用插入排序对对象的arraylist进行排序

时间:2011-03-17 23:27:37

标签: java

这是我使用选择的代码。我需要使用插入,不要使用临时数组或arraylist。我需要有关如何进行插入排序的帮助。

public static void sortStudents(ArrayList<Student> list)
 {//selection sort
  Student tempStudent;
  int count1;
  int count2;
  int largest;

  for (count1=0; count1<list.size()-1; count1++)
  {
   largest = 0;
   for (count2=largest+1; count2<list.size()-count1; count2++)
   {
    if ((list.get(largest)).compareTo(list.get(count2)) < 0)
    {
     largest = count2;
    }
   }
   tempStudent = list.get(list.size()-1-count1);
   list.set(list.size()-1-count1, list.get(largest));
   list.set(largest, tempStudent);
  }
 }
}

2 个答案:

答案 0 :(得分:0)

如果仅在循环中使用变量,则不在循环外定义变量。限制变量的生命周期使得更容易推理代码。

public static void sortStudents (ArrayList<Student> list)
{
  int largest;

  for (int i=0; i < list.size () - 1; i++)
  {
    largest = 0;
    for (int j=largest + 1; j < list.size () - i; j++)
    {
      if ((list.get (largest)).compareTo (list.get (j)) < 0)
      {
         largest = j;
      }
    }
    Student tempStudent = list.get (list.size () - 1 - i);
    list.set (list.size () - 1 - i, list.get (largest));
    list.set (largest, tempStudent);
  }
}

更多缩进使您的代码更具可读性。现在你的具体错误是什么 - 它不编译,抛出异常还是产生错误的结果?

这是内循环中可疑的东西:

    largest = 0;
    for (int j=largest + 1; j < list.size () - i; j++)

如果将max设置为0,则j将初始化为0 + 1 => 1。我想你有另一个意图。你是说j = i + 1;吗?

答案 1 :(得分:0)

选择排序和插入排序的工作方式非常相似,具有列表的“尚未排序”部分和“已排序”部分。在开始时,第一个是整个列表,第二个是开始或结束时的空列表。虽然排序“尚未排序”的部分缩小,而“已经排序”的部分增长,每次迭代一个元素。

选择排序和插入排序之间的区别是:

  • 对于选择排序,您搜索“尚未排序”部分的最小(或最大)元素,将其删除,然后将其添加到已排序部分的结尾(或开头)。
  • 对于插入排序,您将获取列表中“尚未排序”部分的下一个元素,在“已排序”部分中找到它的插入点并将其插入其中。

这应该足以将您的选择排序更改为插入排序。

相关问题