我正在一个个人项目上测试一组对象上的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;
}
答案 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);
}
}