堆排序
堆排序的基本思想:将给定的数组转化成堆,然后将根节点与尾节点互换,将得到的树再次堆化,循环往复直到完成排序。
堆的性质:首先,堆是个完全二叉树,因此可以用一位数组表示;其次,对于堆中的每一个节点,它总是大于自己的孩子节点。
代码主要分为三个核心操作:1 对单个节点堆化;2 将整个数组堆化;3 将堆化的数组排序。
#include<bits/stdc++.h> using namespace std; void heapify(int tree[],int size,int k);//将下标为k的节点进行heapify void swap(int arr[],int a,int b);//交换arr[a]和arr[b]的值 void buildHeap(int tree[],int size);//建立max heap void heapSort(int tree[],int size);//堆排序,从小到大 int main(void) { int arr[]={4,10,8,1,5,12,6,7,0,3,2,15,18}; int size=13; heapSort(arr,size); for(int i=0;i<size;i++) printf("%d ",arr[i]); return 0; } void heapSort(int tree[],int size) { buildHeap(tree,size); for(int i=size-1;i>=0;i--){ swap(tree,i,0); heapify(tree,i,0); } } void buildHeap(int tree[],int size) { int last_node=size-1; int parent=(last_node-1)/2; for(int i=parent;i>=0;i--) heapify(tree,size,i); } void heapify(int tree[],int size,int k) { if(k>=size) return;//递归边界 int Lc=2*k+1,Lr=2*k+2;//Lc和Lr分别为k节点的左右孩子 int max=k;//假定k节点的值相对于孩子来说最大 if(Lc<size&&tree[Lc]>tree[max]) max=Lc; if(Lr<size&&tree[Lr]>tree[max]) max=Lr; if(max!=k){ swap(tree,max,k); heapify(tree,size,max); } } void swap(int arr[],int a,int b) { int tmp; tmp=arr[a]; arr[a]=arr[b]; arr[b]=tmp; }
堆排序的超详细讲解见https://www.bilibili.com/video/av47196993
我把代码粘贴到eclipse里面稍作修改就能用,果然是不依赖于具体的实现语言啊~~