您的位置:首页 > 其它

堆排序

2012-08-18 16:25 405 查看
堆排序 是利用堆的性质进行的一种选择排序,她是不稳定的一种排序方法。

堆排序将元素看做为一颗完全的二叉树。

例如对于数组 a[]={51,38 ,49 , 27,62,5,16,38};

51

/ \

38 49

/ \ / \

27 62 5 16

/

38

利用堆定元素要小于或者等于左右子树的元素值,

取 51 与下层节点比较,把38 给第一个节点,然后,在比较第二个节点 与他的左右子树节点比价,取较小值。一次类推,直到左右子树大于这节点或者没有左右子树为止。

这样就把堆顶元素取为了最小元素,把堆顶元素与最后元素交换,重新对新的堆调整,找到新的最小元素。以此类推,直到剩最后一个元素为止。

void sift(int a[] , int k ,int m) //k为堆顶元素,m为数据长度

{

int i ,j ,k ,t;

i = k;

j= 2*i; //左子树

t = a[k]; //当前节点元素

bool finished = false;

while(j<= m &&(finshed))

{

if(j<m &&(a[j]>a[j+1]))

{

j =j+1;

}

if(t < =a[j])

{

finished = true;

}

else

{

a[i] = a[j];

i = j;

j = 2*i;

}

}

a[i] = t;

}

void heapsort(int a[] , int n)

{

int i , j,k ,m;

m = n/2; //非叶子节点

for(i = m ;i>=1 ;i--)

{

sift(a , i , n);

}

for(i = n ; i>= 2 ;i--)

{

k = a[i];

a[i] = a[1];

a[1] =k;

sift(a , 1 , i-1);

}

}

void main()

{

a[]={0,51,38 ,49 , 27,62,5,16,38};

heapsort(a ,8);

for(int i = 1;i <= 8 ;i++)

{

cout<<a[i];

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