使用Java实现堆操作
class Heap_Test { public static final int MAXSIZE = 500; class heap { int[] data; int MaxSize; boolean Flag; int len; } public boolean HeapInit(heap heap, boolean Flag) throws Exception { if (heap == null) { return false; } heap.data = new int[MAXSIZE]; heap.Flag = Flag; heap.MaxSize = MAXSIZE; heap.len = 0; return true; } public void HeapInsert(heap heap, int InsertData) throws Exception{//向堆中插入一个元素 if (heap == null) { return; } if(heap.len>=heap.MaxSize){ throw new Exception("Insert:堆已满"); } heap.data[heap.len] = InsertData;//先往数组尾插一个元素 int Tuning = heap.len;//要调整的元素下标 int Parent = 0;//双亲下标 int temp = 0;//交换变量 heap.len++; while (Tuning != 0) { Parent = (Tuning - 1) / 2; if (heap.Flag) {//小堆 if (InsertData >= heap.data[Parent]) { break; } temp = heap.data[Parent]; heap.data[Parent] = heap.data[Tuning]; heap.data[Tuning] = temp; Tuning = Parent; } else {//大堆 if (InsertData <= heap.data[Parent]) { break; } temp = heap.data[Parent]; heap.data[Parent] = heap.data[Tuning]; heap.data[Tuning] = temp; Tuning = Parent; } } } public int GetHeapTop(heap heap) throws Exception {//返回堆顶元素并删除 if (heap == null) { throw new Exception("GetHeapTop时堆不存在"); } if(heap.len == 0){ throw new Exception("GetHeapTop时堆为空"); } int ret = heap.data[0];//存放堆顶元素 heap.len--; if (heap.len == 0) { return ret; } int TuningData = heap.data[heap.len];//存放需要调整的元素 int i = 0; int j = 2 * i + 1; if(heap.Flag) { while (j <= heap.len - 1) {//找到另一个需要调整元素的位置 if (heap.data[j + 1] < heap.data[j]) {//如果右孩子比左孩子小,就让j的下标变为右孩子的 j++;//现在j下标是较小的孩子的位置 } if (TuningData < heap.data[j]) {//如果调整元素比左孩子和右孩子都小,就结束循环 break; } heap.data[i] = heap.data[j];//将孩子元素放在双亲位置 i = j;//调整位置变为较小的孩子的位置 j = 2 * i + 1;//新的调整位置变为新的位置的左孩子的位置 } heap.data[i] = TuningData;//i就是最终找到的,另一个要换的位置 return ret; }else { while (j <= heap.len - 1) {//找到另一个需要调整元素的位置 if (heap.data[j + 1] > heap.data[j]) {//如果右孩子比左孩子大,就让j的下标变为右孩子的 j++;//现在j下标是较小的孩子的位置 } if (TuningData > heap.data[j]) {//如果调整元素比左孩子和右孩子都大,就结束循环 break; } heap.data[i] = heap.data[j];//将孩子元素放在双亲位置 i = j;//调整位置变为较大的孩子的位置 j = 2 * i + 1;//新的调整位置变为新的位置的左孩子的位置 } heap.data[i] = TuningData;//i就是最终找到的,另一个要换的位置 return ret; } } public boolean IsEmptyHeap(heap heap)throws Exception{//检查是否是空堆 if(heap == null){ throw new Exception("IsEmpty:堆不存在"); } if(heap.len == 0){ return true; } return false; } public void DestoryHeap(heap heap)throws Exception{//销毁堆 if(heap == null){ throw new Exception("Destory:堆不存在"); } heap.len = 0; } public int[] HeapSort(heap heap)throws Exception{ if(heap == null){ throw new Exception("Sort:堆不存在"); } int[] ret = new int[heap.len]; for(int i = 0;i<ret.length;i++) { ret[i] = GetHeapTop(heap); } return ret; } } public class Main { public static void main(String[] args) throws Exception { Heap_Test Test = new Heap_Test(); Heap_Test.heap heap = new Heap_Test().new heap(); int[] data = new int[]{1, 2, 3}; Test.HeapInit(heap, true);//ture为小堆,false为大堆 Test.HeapInsert(heap, 28); Test.HeapInsert(heap, 55); Test.HeapInsert(heap, 41); Test.HeapInsert(heap, 60); Test.HeapInsert(heap, 38); Test.HeapInsert(heap, 52); Test.HeapInsert(heap, 12); Test.HeapInsert(heap, 21); // while (heap.len != 0) { // System.out.println(Test.GetHeapTop(heap)); // } System.out.println(Test.IsEmptyHeap(heap));//检查堆是否为空 int[] AfrerSort = Test.HeapSort(heap);//堆排序 for (int i : AfrerSort) { System.out.print(i); } } }