堆排序
2017-04-25 13:46
190 查看
C++
Python
首位留空,方便节点计算
#include <iostream> #include<algorithm> using namespace std; void HeapAdjust(int *a,int i,int size) //调整堆 { int lchild=2*i; //i的左孩子节点序号 int rchild=2*i+1; //i的右孩子节点序号 int max=i; //临时变量 if(i<=size/2) //如果i不是叶节点就不用进行调整 { if(lchild<=size&&a[lchild]>a[max]) { max=lchild; } if(rchild<=size&&a[rchild]>a[max]) { max=rchild; } if(max!=i) { swap(a[i],a[max]); HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆 } } } void BuildHeap(int *a,int size) //建立堆 { int i; for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2 { HeapAdjust(a,i,size); } } void HeapSort(int *a,int size) //堆排序 { int i; BuildHeap(a,size); for(i=size;i>=1;i--) { //cout<<a[1]<<" "; swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 //BuildHeap(a,i-1); //将余下元素重新建立为大顶堆 HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆 } } int main() { //int a[]={0,16,20,3,11,17,8}; int a[100]; int size; while(scanf("%d",&size)==1&&size>0) { int i; for(i=1;i<=size;i++) cin>>a[i]; HeapSort(a,size); for(i=1;i<=size;i++) cout<<a[i]<<" "; cout<<endl; } return 0; }
Python
def heapadjust(l,i,size): lchild,rchild=2*i,2*i+1 maxs=i if i<=size: if rchild<=size and l[maxs]<l[rchild]: maxs=rchild if lchild<=size and l[maxs]<l[lchild]: maxs=lchild if maxs!=i: l[maxs],l[i]=l[i],l[maxs] heapadjust(l,maxs,size) def heapsort(l): for x in range(int((len(l)-1)/2),0,-1): heapadjust(l,x,len(l)-1) for x in range(len(l)-1,0,-1): l[1],l[x]=l[x],l[1] heapadjust(l,1,x-1) return l[1:] l=[-1,26,5,77,1,61,11,59,15,48,19] print(heapsort(l))
首位留空,方便节点计算
相关文章推荐