堆排序

堆排序 是利用堆的性质进行的一种选择排序,她是不稳定的一种排序方法。

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

例如对于数组 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];

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值