typedef unsigned int word; /**************************************堆排序算法***************************************/ // 堆排序算法 // 父节点,左节点,右节点下标(其实是下标+1) #define PARENT(x) ((x) >> 1) #define LEFT(x) ((x) << 1) #define RIGHT(x) (((x) << 1) + 1) // =================================================== // 保持堆性质 // parent:父节点下标 // heap_size:数组中堆元素个数 // =================================================== void max_heapify(word *p,word heap_size, word parent) { word temp; word left,right,largest; left = LEFT(parent+1) - 1; // 减1,下标数 right = RIGHT(parent+1) - 1; if((left < heap_size) && (*(p+left) > *(p+parent))) largest = left; else largest = parent; if((right < heap_size) && (*(p+right) > *(p+largest))) largest = right; if(largest != parent) { temp = *(p+largest); *(p+largest) = *(p+parent); *(p+parent) = temp; max_heapify(p,heap_size,largest); } } // =================================================== // 建堆 // =================================================== void build_max_heap(word *p,word length) { word i = length / 2; word heap_size = length; for(i = length / 2; i != ~0; i--) max_heapify(p,heap_size,i); } // =================================================== // 堆排序 // =================================================== void heap_sort(word *p,word length) { word temp; word i,heap_size; heap_size = length; build_max_heap(p,length); // 建堆 for(i = length -1; i != 0; i--) { temp = *p; *p = *(p+i); *(p+i) = temp; heap_size--; max_heapify(p,heap_size,0); } } /**************************************用堆实现的优先级队列***************************************/ // =================================================== // 返回队列中最大关键字元素 // 注意:p是已建立好的堆 // =================================================== word heap_maximum(word *p) { return *p; } // =================================================== // f去掉并返回队列中具有最大关键字的元素 // =================================================== word heap_extract_max(word *p, word heap_size) { word max; if(heap_size == 0) // 堆元素个数为0,即空堆 return 0; // 空堆则返回0 max = *p; *p = *(p + heap_size -1); heap_size--; max_heapify(p,heap_size,0); return max; } // =================================================== //将元素i的关键值增加到key // 返回值:0,key小于原关键值,增加失败;1,成功 // =================================================== word heap_increase_key(word *p,word i, word key) { word temp; if(key < *(p+i)) return 0; while(i != 0) { if(*(p + PARENT(i + 1)) < *(p+i)) { temp = *(p + PARENT(i + 1)); *(p + PARENT(i + 1)) = *(p+i); *(p + i) = temp; i = PARENT(i + 1); } else // 若不是,则跳出循环 break; } if(i == 0) { if(*p < *(p + 1)) { temp = *p; *p = *(p + 1); *(p + 1) = temp; } } return 1; } // =================================================== // 把元素key插入到队列中 // 注意:可不用返回值,由调用函数本身将heap_size+1 // =================================================== word max_heap_insert(word *p,word heap_size, word key) { *(p + heap_size) = 0; if(!heap_increase_key(p,heap_size,key)) return 0; heap_size++; return heap_size; }