使用对象数组的Heapsort Java

时间:2018-11-27 01:40:11

标签: java heapsort

我正在一个个人项目上测试一组对象上的heapsort。我正在使用HS组织一组学生。以一个学校项目的示例为例,我已经使用“选择”排序将这些代码放在一起:

public static void heapify(Student[] studentList, int i, int size)
 {  

      int right = 2*i+2;
      int left = 2*i+1;
      Student leftStudent = studentList[left];
      Student rightStudent = studentList[right];
      int max;

      if(left <= size && leftStudent.getGrades() > studentList[i].getGrades())
          max = leftStudent.getGrades();          
      else            
       max = studentList[i].getGrades();


      if(right <= size && rightStudent.getGrades() > studentList[max].getGrades())
          max = rightStudent.getGrades();


      if(max != studentList[i].getGrades())
      {

         switchNodes(studentList, i, max);
         heapify(studentList, max, size);

      }

   }

我已经检查过其他部分是否有正确的帮助程序代码,并且确实如此。我不断收到

  

ArrayOutofBounds错误

在我调用此方法的代码中。

如何使用Student Object调用成功实现算法?

PS:辅助代码如下

public static void makeHeap(Student[] studentList)
{

    for(int i = studentList.length/2; i>=0; i--)
        heapify(studentList, i, studentList.length-1);




}

public static Student[] heapSort(Student[] studentList)
{

     makeHeap(studentList);
      int sizeOfHeap = studentList.length-1;
      for(int i = sizeOfHeap; i>0; i--)       
      {

         switchNodes(studentList, 0, i);
         sizeOfHeap--;
         heapify(studentList, 0, sizeOfHeap);

      }     

    return studentList;
}

   public static void switchNodes(Student[] studentList,int i, int j)
   {

       Student temp = studentList[i];
       studentList[i] = studentList[j];
       studentList[i] = temp;

   }

2 个答案:

答案 0 :(得分:1)

您没有给来电者部分。但是我发现有些冒险。

int right = 2*i+2;
int left = 2*i+1;
Student leftStudent = studentList[left];
Student rightStudent = studentList[right];
int max;

if(left <= size && leftStudent.getGrades() > studentList[i].getGrades())
    max = leftStudent.getGrades();          
else            
    max = studentList[i].getGrades();


if(right <= size && rightStudent.getGrades() > studentList[max].getGrades())
    max = rightStudent.getGrades();

您检查了左右是否小于尺寸,非常好。但是您需要在使用这些变量之前执行此操作。在写作时,

Student leftStudent = studentList[left];
Student rightStudent = studentList[right];

您如何知道左侧和右侧是否尚未访问内存,您尚未创建?所以我的建议是,将这些部分编辑为以下内容:

int right = 2*i+2;
int left = 2*i+1;
if(left > size || right > size)
    // will you return or anything else?
    // if size if equal to list size, then you need to add >=
    // instead of only >

我再次写信,您尚未发布完整代码。但是在您的代码中,这绝对是危险的。根据您的代码逻辑更改此代码。

答案 1 :(得分:0)

您应将此行添加到heapify方法 if(left> size || right> size)return;

您的heapify方法应类似于

public static void heapify(Student[] studentList, int i, int size)
 {  

      int right = 2*i+2;
      int left = 2*i+1;
      if(left>size || right>size) return;
      Student leftStudent = studentList[left];
      Student rightStudent = studentList[right];
      int max;

      if(left <= size && leftStudent.getGrades() > studentList[i].getGrades())
          max = leftStudent.getGrades();          
      else            
       max = studentList[i].getGrades();


      if(right <= size && rightStudent.getGrades() > studentList[max].getGrades())
          max = rightStudent.getGrades();


      if(max != studentList[i].getGrades())
      {

         switchNodes(studentList, i, max);
         heapify(studentList, max, size);

      }

   }

完整的工作代码

class Student
{
    int id;
    int grade;
    public int getGrades()
    {
        return grade;
    }
    public Student(int id,int grade)
    {
        this.id=id;
        this.grade=grade;
    }
}
public class HelloWorld{

     public static void heapify(Student[] studentList, int i, int size)
 {  

      int right = 2*i+2;
      int left = 2*i+1;
      if(left>size || right>size) return;
      Student leftStudent = studentList[left];
      Student rightStudent = studentList[right];
      int max;

      if(left <= size && leftStudent.getGrades() > studentList[i].getGrades())
          max = leftStudent.getGrades();          
      else            
       max = studentList[i].getGrades();


      if(right <= size && rightStudent.getGrades() > studentList[max].getGrades())
          max = rightStudent.getGrades();


      if(max != studentList[i].getGrades())
      {

         switchNodes(studentList, i, max);
         heapify(studentList, max, size);

      }

   }

public static void makeHeap(Student[] studentList)
{

    for(int i = studentList.length/2; i>=0; i--)
        heapify(studentList, i, studentList.length-1);




}

public static Student[] heapSort(Student[] studentList)
{

     makeHeap(studentList);
      int sizeOfHeap = studentList.length-1;
      for(int i = sizeOfHeap; i>0; i--)       
      {

         switchNodes(studentList, 0, i);
         sizeOfHeap--;
         heapify(studentList, 0, sizeOfHeap);

      }     

    return studentList;
}

   public static void switchNodes(Student[] studentList,int i, int j)
   {

       Student temp = studentList[i];
       studentList[i] = studentList[j];
       studentList[i] = temp;

   }
  public static void main(String[] args)
  {
      Student[] students= new Student[10];
      for(int i=0;i<10;i++)
      {
       students[i]=new Student(i,i);   
      }
      makeHeap(students);
  }
}