gpt4 book ai didi

java - 使用堆排序对数组进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:17:16 26 4
gpt4 key购买 nike

我在做我的算法的期中复习,我试图用 Java 实现所有的伪代码,以便更好地理解算法。但是在堆排序部分,我的代码有问题。我的输入数组是

{10,16,4,10,14,7,9,3,2,8,1}

第一个元素只代表我想要排序的元素的数量。也就是说,需要排序的元素是从索引1开始的。

我构建最大堆的输出是:16 14 10 8 7 9 3 2 4 1

我的堆排序输出是:1 3 2 4 7 8 9 10 14 16

我的 build-max-heap 部分似乎运行良好,但我也找不到堆排序部分中的错误。

public class Midterm{
public static void main(String[] args){
int[] C = {10,16,4,10,14,7,9,3,2,8,1};
/*for convenience, the first element in array C represent the
number of elements needed to be heapified;
*/
Midterm heap = new Midterm();
int n = C.length - 1;
for (int i = (n / 2); i > 0; i--){
heap.maxHeapify(C, i, n);
}

int index = 1;
while(index <= n){
System.out.print(C[index] + " ");
index++;
}
System.out.println();

Midterm heap2 = new Midterm();
heap2.heapSort(C);
int index2 = 1;
while(index2 <= n){
System.out.print(C[index2] + " ");
index2++;
}
System.out.println();

}

public void heapSort(int[] A){
int n = A.length - 1;
for (int i = n; i >= 2; i--){
exchange(A, 1, i);
maxHeapify(A, 1, i - 1);
}
}
public void maxHeapify(int[] A, int i, int n){
int left = 2 *i, right = 2 * i + 1;
int largest;
if (left < n && A[left] > A[i]){
largest = left;
}else{
largest = i;
}
if (right < n && A[right] > A[largest]){
largest = right;
}
if (largest != i){
exchange(A, i, largest);
maxHeapify(A, largest,n);
}
}
private void exchange(int[] A, int i , int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}

最佳答案

您的代码中有 2 个错误:

1. 堆排序的 for 循环从最后一个元素第一个元素,所以

for (int i = n; i >= 2; i--){

应该是:

for (int i = n; i >= 1; i--){

因为索引从 0 开始。

2。执行完 exchange(A, 1, i) 后,正确的调用应该是:

maxHeapify(A, 1, i)

关于java - 使用堆排序对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42801624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com