关于堆排序的一些基础学习和伪代码实现

/**二叉树的存储存储到数组当中,会有先序中序和后序遍历
例如一棵存储的二叉树数组元素 78,56,34,43,4,1,15,2,23
先序遍历结果是 先根左右 78 56 43 2 23 34 1 15
中序遍历结果是2 43 23 56 4 78 1 34
后序遍历结果是 2 23 43 4 56 1 15 34 78
/**
伪代码如下: 利用的是递归调用的形式
preOrder(arr , index):
    if (i >= arr.length)//终止条件当超过数组长度了就返回
    return;
    print(arr[i])
    preOrder(arr, 2*i+1)//输出左子树
    preOrder(arr, 2*i+2)//输出右子树
     
midOrder(arr, index):
    if (i>=arr.length)
    return;
    midOrder(arr, 2*i+1)//先输出左子树
    print(arr[i])
    midOrder(arr,2*i+2)//输出右子树

/**
堆的概念:二叉堆是完全二叉树或者近似完全二叉树
二叉堆满足1,父结点的键值总是大于或等于(小于或等于)
任何一个子节点的键值
每个结点的左子树和右子树都是一个二叉堆(都是最大堆和
最小堆)
任意节点值都大于其子节点值---大顶堆
任意节点值都小于其子节点值---小顶堆

关于小顶堆排序的伪代码实现思路
从一个二叉树的存储的n/2-1处出发进行节点的调整
如果节点值小于左右节点,则与最小的交换,
然后再进行向下调整这叫做堆化,如果堆化完成后
顺序输出就行
伪代码实现如下:

minHeapSort(arr)
    n= (arr.length)/2-1
        for (int i =n;i<=0;i--)
            minHeapFixDown(arr, i)
minHeapFixDown(arr, i):
    left  = 2*i+1;//用left表示左节点更容易理解,比j,k实用
    right = 2*i +2 //用right表示右节点更容易理解
    //先确定最小的节点值 //比单纯的三个值比较更有效( if (arr[j]>arr[k] && arr[i]>arr[k]) )
    min = 0;
    //边界条件判断
     if (left>=n)
        return;
    //min指向左右孩子中较小的那个
     min = left
     if (right>=n)
        min = left
     else {
    if (arr[right]<arr[left]){
 
          min = right;
           }
     //如果arr[i]比两个孩子都小,不用调整
        if(arr[i]<=arr[min])
           return;
     //否则,找到两个孩子中较小的,和i交换
      temp = arr[i],
      arr[i] = arr[min]
      a[min]= temp;
      minHeapFixDown(arr, min)
      }
  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值