我有一个程序,它读入一个文本文件并创建许多可用于构建 MIN 堆的节点元素。
我正在努力解决的是,在正确构建最小堆后,我应该通过使用“提取”方法对元素进行排序,以删除根处的最小元素并将其添加到旨在包含的单独 ArrayList 中排序后的元素。
当然,我们应该一次提取一个元素并将其添加到我们的新数组列表中,然后从剩余节点的堆中删除该元素,以便堆不断减少一个元素,而排序后的数组列表则不断增加一个元素直到堆中没有剩余元素。
我相信问题是在提取最小堆的根元素后,根元素本身没有被删除,它似乎仍然留在堆中,即使我的提取方法应该通过将其替换为覆盖已删除的根元素堆中的最后一项,然后递减堆大小并重新应用“heapify”方法来恢复堆属性。
我的代码相当简单,主要方法很长,但重要的部分如下:
g = new Graph();
readGraphInfo( g );
DelivB dB = new DelivB(inputFile, g);
int numElements = g.getNodeList().size();
ArrayList<Node> ordered_nodeList = new ArrayList<Node>(15);
ArrayList<Node> sorted_nodeList = new ArrayList<Node>(15);
h = new Heap(ordered_nodeList, g);
for (int i = 0; i < numElements; i++)
{
ordered_nodeList.add(i, g.getNodeList().get(i));
h.Build_min_Heap(ordered_nodeList);
System.out.println("Heap: \n");
System.out.println("\n**********************" + "\nProg 340 line 147" +h.heapClass_toString(ordered_nodeList));
//System.out.println("the " + i + "th item added at index " + i + " is: " + ordered_nodeList.get(i).getAbbrev());
}
for (int j = 0; j < numElements; j++)
{
sorted_nodeList.add(j, h.heap_Extract(ordered_nodeList));
System.out.println("the "+j+"th item added to SORTED node list is: "+sorted_nodeList.get(j).getAbbrev()+ " "+ sorted_nodeList.get(j).getVal());
//h.heap_Sort(ordered_nodeList);
System.out.println("\nthe 0th remaining element in ordered node list is: " + ordered_nodeList.get(0).getVal());
h.Build_min_Heap(ordered_nodeList);
}
for (Node n : sorted_nodeList)
{
System.out.println("sorted node list after extract method*****************\n");
System.out.println(n.toString());
}
动漫人物
相关分类