//heapsort.h
#include
#define LEFT(i) (2 * (i)) //数组下标从1开始
#define RIGHT(i) ((2 * (i)) +1)
#define PARENT(i) ((i) / 2) //i 为整形,parent是求不大于(i/2)的值
//heapsort.c
#include "heapsort.h"
static int heapsize;
void max_heapify(int key[], int i)
{
int left, loop;
int right;
int largest;
int temp;
static int n = 0;
left = LEFT(i);
right = RIGHT(i);
//printf("第%d次循环,left = %d,right= %d/n", ++n,left,right);
if(left <= heapsize && key[left] > key[i])
largest = left;
else
largest = i;
if( right <= heapsize && key[right] > key[largest])
largest = right;
if(largest != i){
// for(loop = 1; loop <= heapsize; loop++)
// printf("%d ", key[loop]);
//printf("第%d次循环,i=%d,largest=%d,key[largest]=%d,交换了%d<--->%d/n", n, i, largest, key[largest], key[i],key[largest]);
temp = key[i];
key[i] = key[largest];
key[largest] = temp;
max_heapify(key, largest);
}
return;
}
void build_max_heap(int key[])
{
int loop;
for(loop = heapsize / 2; loop > 0; loop --){
max_heapify(key, loop);
}
return;
}
void heapsort(int key[])
{
int loop;
int temp;
build_max_heap(key);
//for(loop = 1; loop <= heapsize; loop++){
// printf("%d ", key[loop]);
//}
//printf("/n");
for(loop = heapsize; loop > 1; loop--){
printf("%d ", key[1]);
temp = key[1];
key[1] = key[loop];
key[loop] = temp;
heapsize -= 1;
max_heapify(key, 1);
}
return;
}
int main(int argc, char* argv[])
{
int key[] = { 0,5,3,17,10,84,19,6,22,9};
int n;
heapsize = sizeof(key)/(sizeof(int)) - 1;
heapsort(key);
scanf("%d", &n);
return 0;
}
堆排序----C语言
最新推荐文章于 2024-06-08 13:37:24 发布