堆排序
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];
}
堆排序将元素看做为一颗完全的二叉树。
例如对于数组 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];
}