堆排序算法

小根堆:所有子节点都大于其父节点。

大根堆:所有子节点都小于其父节点。

int heapSize = 0;

//返回左子节点索引
int Left(int index){return ((index << 1) + 1);}

//返回右子节点索引
int Right(int index){return ((index << 1)+ 2;)} 

//交换a,b的值
void swap(int *a, int *b){int temp = *a; *a = *b; *b = temp;}

//array[index]与其左、右子树进行递归对比
//用最大值替换array[index],index表示堆顶索引
void maxHeapify(int array[], int index)
{
       int largest = 0;
       int left = Left(index);      //左子节点索引
       int right = Right(index); //右子节点索引
       
       //把largest赋为堆顶与其左子节点的较大值
       if((left <= heapSize) && (array[left] > array[index]))
             largest = left;
       else
             largest = index;
       //把largest与堆顶的右子节点比较,取较大值
       if((right <= heapSize) && (array[right] > array[largest]))
             largest = right;
       //此时largest为堆顶、左子节点、右子节点中的最大值
       if(largest != index)
       {
              //如果堆顶不是最大值,则交换,并递归调整堆
              swap(&array[index],&array[largest]);
              maxHeapify(array, largest);
       }
}

//初始化堆,将数组中的每一个元素置放到适当的位置
//完成之后,堆顶的元素为数组的最大值
void buildMaxHeap(int array[], int length)
{
       int i;
       heapSize =length;  //堆大小赋为数组长度
       for( i = (length >> 1); i >=0; i--)
       {
               maxHeapify(array, i);
       }
}

void heap_sort(int array[], int length)
{
      int i;
      //初始化堆
      buildMaxHeap(array, (length - 1));
      for(i = (length - 1); i >= 1; i--)
      {
             //堆顶元素array[0](数组的最大值)被置换到数组的尾部array[i]
             swap(&array[0],&array[i]);
             heapSize--;                   //从堆中移除该元素
             maxHeapify(array, 0);   //重建堆
      }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值