我正在尝试使用java进行一些非常有趣的操作。
首先,我创建一个最大堆。然后将第一个元素变为max max,将最后一个项目从unarranged数组移到堆顶部,然后按下。
我尝试了21个元素,70%的时间工作正常,我想知道是否有人发现问题。
感谢。
public class HeapSort extends Sort{
public int sort(int arr[]) {
for (int i = 1; i < arr.length; i++) {
// add to heap
int p = i;
int pp = p /2 ;
while (p > 0 && arr[pp] < arr[p]) {
swap(arr, p, pp);
p = pp;
pp = p / 2;
}
}
for (int i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i);
int p = 0;
int child1 = (p << 1) + 1;
int child2 = (p << 1) + 2;
while (child2 < i || child1 < i) {
if (child1 >= i) {
if (arr[p] < arr[child2]) {
swap(arr, p, child2);
p = child2;
} else {
break;
}
} else if (child2 >= i) {
if (arr[p] < arr[child1]) {
swap(arr, p, child1);
p = child1;
} else {
break;
}
} else {
int minIdx = arr[child1] < arr[child2] ? child1 : child2;
int maxIdx = child1 == minIdx ? child2 : child1;
if (arr[p] < arr[maxIdx]) {
swap(arr, p, maxIdx);
p = maxIdx;
} else {
break;
}
}
child1 = (p << 1) + 1;
child2 = (p << 1) + 2;
}
}
return 0;
}
void swap(int arr[], int idx1, int idx2) {
int tmp = arr[idx1]; arr[idx1] = arr[idx2]; arr[idx2] = tmp;
}
public String toString() {
return "HeapSort";
}
}
答案 0 :(得分:2)
您没有在堆排序的第一步中正确构建堆。在基于零的数组上除以2之前,需要减去一个。
public class HeapSort extends Sort{
public int sort(int arr[]) {
for (int i = 1; i < arr.length; i++) { // add to heap
int p = i;
// int pp = p /2 ; <======= Problem!
int pp = (p-1) / 2;
while (p > 0 && arr[pp] < arr[p]) {
swap(arr, p, pp); p = pp;
// pp = p / 2; // <=====Problem!
pp = (p-1) /2;
}