Java 堆排序问题
我正在研究一个家庭作业问题,涉及java中的堆排序实现。这是我到目前为止所拥有的Java 堆排序问题,java,algorithm,sorting,heapsort,Java,Algorithm,Sorting,Heapsort,我正在研究一个家庭作业问题,涉及java中的堆排序实现。这是我到目前为止所拥有的 public class HeapSort { public static void maxHeapify(int[] a, int i) { int largest; int l = 2*i; int r = (2*i)+1; if (l<=a.length-1 && a[l]>a[i]) {
public class HeapSort {
public static void maxHeapify(int[] a, int i) {
int largest;
int l = 2*i;
int r = (2*i)+1;
if (l<=a.length-1 && a[l]>a[i]) {
largest = l;
}
else {
largest = i;
}
if (r<a.length-1 && a[r]>a[largest]) {
largest = r;
}
if (largest != i) {
int temp = a[i];
a[i] = a[largest];
a[largest] = temp;
maxHeapify(a,largest);
}
}
public static void buildMaxHeap(int[] a) {
for (int i=(a.length-1/2); i>=1; i--) {
maxHeapify(a,i);
}
}
public static void heapSort(int[] a) {
buildMaxHeap(a);
for (int i=a.length-1; i>=1; i--) {
int temp = a[0];
a[0] = a[i];
a[0] = temp;
maxHeapify(a,1);
}
}
我目前没有收到任何错误,但输出只是有点差。非常感谢您的帮助。谢谢
*编辑以添加示例输出快速浏览一下,我想说您错过了对maxHeapify()的许多调用。看起来您只需要maxHeapify()堆的一半(在最右边分支中结束的那一半),而不是其余部分。必须将[0]中的所有元素的maxHeapify()调用为[length/2] 您应该将对maxHeapify()的递归调用移出交换条件。对于堆的初始构建,必须一直传播到根。 而且您不需要maxHeapify()最大的元素,而是堆上一层的元素,因此总是
i/2
if(ra[maxist]){
if (r<a.length-1 && a[r]>a[largest]) {
largest = r;
}
最大=r;
}
应该是
if (r<=a.length-1 && a[r]>a[largest]) {
largest = r;
}
if(ra[最大]){
最大=r;
}
我相信您还必须调用
maxHeapify(a,0)代码>而不是maxHeapify(a,1)代码>在最后一个循环中。除此之外,上述评论中的-1/2订购问题。这应该就可以了。(a.length-1/2)
非常确定它的a.length/2
在BuildMaxHeap()
中,也许你是想写(a.length-1)/2
。注意操作顺序…a.length-1/2==a.length
。进行了此更改,并尝试使用相同的输出将其更改为a.length/2。一定还有别的事。谢谢你的建议!
if (r<=a.length-1 && a[r]>a[largest]) {
largest = r;
}