再说堆排序时,我们首先谈谈什么是大顶堆,小顶堆。
所谓大顶堆,首先是一个二叉树。然后给个节点的左子节点和右子节点都小于他们的父节点。而小顶堆正好相反。
很明显拿到数据,我们首先将数据转化为大顶堆。代码:
void adjust(int arr[],int i,int length) { int temp = arr[i]; for(int k = 2 * i + 1; k < length; k = 2 * k + 1) { if(k + 1 < length && arr[k] < arr[k+1]) { k++; } if(arr[k] > temp) { arr[i] = arr[k]; i = k; }else{ break; } arr[i] = temp; } }
arr 就是要转化的数组。i 是你要操作的节点 length 你要操作数组的长度。
排好后将大顶堆的根节点排到最后。这一操作肯定会打乱大顶堆。我们只需再一次转为大顶堆就ok了。代码:
void sort(int arr[],int length) { for(int i = length / 2 - 1; i >= 0; i--) { adjust(arr,i,length); } for(int j = length - 1; j > 0; j--) { int temp = arr[j]; arr[j] = arr[0]; arr[0] = temp; adjust(arr,0,j); } }
整个过程就好了。在此说明一下:adjust 形参i 的计算方法: i = arr.length/2 -1
原文:https://www.cnblogs.com/zdybj/p/12424217.html