您的位置:首页 > 其它

【排序】Heap Sort

2012-11-30 10:06 274 查看
What's heap ? it's main feature: root is the smallest(largest), nodes with children are larger than children. Root which is the smallest ,called Small Heap. Otherwise, we called it Big Heap if it's largest.

we now represent the heap in data stuct of Heap in the way of array.

In order to finish heap sort, we need to do 2 things:

build a heap

remove the root ,which is largest/smallest element , and rebuild the heap

Here is the code:

#include <stdio.h>

#include "type.h"

void swap(ElemType *a, ElemType *b)

{

ElemType tmp = *a;

*a=*b;

*b=tmp;

}

void HeapAdjust(SqList *L, int start, int end)

{

printf("Adjust %d %d \n", start, end);

int j, temp, i;

temp = L->data[start];

i = start;

//Note:2*start , if start==0, then j==0 . That's why we NEED THE LIST TO START FROM 1, INSTEAD OF 0

for(j = 2*start; j<=end; j*=2)

{

//compare left child [2*start] and right child [2*start+1]

if(L->data[j]<L->data[j+1] && j<end)

j++;//right child is larger than left child

if(temp>=L->data[j])//temp(position [start]) is already the largest

break;

L->data[start] = L->data[j];// Note:change

start = j;//above line changed the heap, we now need to reconstruct

}

printf("largest now[%d]:%d <-> [%d]:%d \n",start, L->data[start], temp, i);

L->data[start] = temp;

}

void HeapSort(SqList *L)

{

//construct the list into a heap, starting from nodes with children

for(int i = (L->length)/2; i>0; i--)

HeapAdjust(L, i, L->length);

//swap out the largest , and then reconstruct the list into a new heap

for(int i=L->length; i>1; i--)

{

swap(&(L->data[1]), &(L->data[i]));

HeapAdjust(L, 1, i-1);

}

}

void printContent(SqList *L)

{

for(int i = 1; i<= L->length; i++)

{

printf("%d \t",L->data[i] );

}

}

int main(void)

{

SqList l ;

l.data={-1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

l.length = 16;

printContent(&l);

printf("\n");

HeapSort(&l);

printContent(&l);

printf("\n");

return 0;
}

Note that: we create array with [0] empty , for the conveniece for j=2*start, during of computing the tree.

EOF
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: