堆排序的问题高手进

来源:百度知道 编辑:UC知道 时间:2024/09/28 06:56:32
void createheap(int *heap, int root, int index)
{
int j;
int temp;
int finish;

j = 2 * root;

temp = heap[root];
finish = 0;

while(j <= index && finish == 0)
{
if(j < index)
{
if(heap[j] < heap[j + 1])
j++;
}

if(temp >= heap[j])
finish = 1;
else
{
heap[j / 2] = heap[j];
j = 2 * j;
} heap[j / 2] = temp;
}

void HeapSort(int *heap, int index)
{
int i, j, temp;

for(i = (index / 2); i > 0; i--)
createheap(heap, i, index);

for(i = index - 1; i >= 1; i--)
{
temp = heap[i + 1];
heap[i + 1] = heap[1];
heap[1] = temp;

createheap(heap, 1, i);

printf("Sorting process:");
for(j = 1; j <= ind

以最大堆为例
#define LEFT(i) 2*i
#define RIGHT(i) 2*i+1
/***********以下为堆排序**********/
void MAX_HEAPIFY(keytype *a,int i,int size)
//保持堆的性质,使以i为根的子树成为最大堆
//过程描述:
/*
从元素a[i],a[left(i)],a{right(i)]中找出最大的,并将其下标保存在largest中。如果a[i]是最大的,则以i为根的子树以是最大堆,程序结束。否则,i的某个子结点中有最大元素,则交换a[i]与a[largest],从而使i及其子女满足堆性质。下标为largest的结点在交换后的值是a[i],以该结点为根的子树又有可能违反最大堆性质,因而要迭代这个过程。
*/
{
int largest=-1;
for(;;i=largest)
{
int l=LEFT(i),r=RIGHT(i);
if(l<=size&&a[l-1]>a[i-1])
largest=l;
else
largest=i;
if(r<=size&&a[r-1]>a[largest-1])
largest=r;
if(largest==i)break;

swap(&a[i-1],&a[largest-1]);
}
}
void BUILD_MAX_HEAP(keytype *a,int size)
//子数组a[size/2+1]...a[size]的元素都是叶子,所以只对前面的元素保持堆的性质即可完成建堆
{
int i=size/2;
while(i>=1)
{
MAX_HEAPIFY(a,i--,size);
}
}
void HeapSort(keytype *a,int size)//排序调用函数
{