#include <stdio.h>
#include <iostream>
using namespace std;
int heapsize=4;//数组长度,数组下标从1开始记,否则计算下标为0的孩子结点的下标麻烦
int j=0;
void maxHeapify(int a[],int i){ //使以a[i]为根的子树成为最大堆
//假设以a[left]和a[right]为根的2棵二叉树都是最大堆
int left=i<<1; //i的左孩子下标
//printf("i=%d",i);
int right=left+1;//i的右孩子下标**原先写成right=i<<1+1
int largest=i; //记录最大值的下标
if(i<=heapsize/2){ //可以不加 如果i是叶节点就不用进行调整
if(left<=heapsize&&(a[left]>a[i])){
largest=left;
}
if(right<=heapsize&&(a[right]>a[i]))
largest=right;
if(largest!=i){
int temp=a[i];
a[i]=a[largest];
a[largest]=temp;
maxHeapify(a,largest);
}
}
}
void buildMaxHeap(int a[]){
for(int i=heapsize/2;i>0;i--)
maxHeapify(a,i);
}
void heap_sort(int a[]){
int len=heapsize;
buildMaxHeap(a);
for(int i=len;i>1;i--){
printf("%d ",a[1]);//从大到小输出
int temp=a[1];//b[j]=temp;j++;
a[1]=a[i];
a[i]=temp;
heapsize--;//最终出bug在这儿,写成了len--,可以每次把heapsize传入函数
maxHeapify(a,1);
}
printf("%d\n",a[1]);
}
int main(){
int a[]={0,2,4,1,3};//a[0]不算
heap_sort(a);
for(int i=1;i<=4;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
public class HeapSort { public static int heapsize=4; public static void main(String[] args) { int a[]={0,2,4,1,3};//a[0]不算 heap_sort(a); for(int i=1;i<=4;i++){ System.out.printf("%d ",a[i]); } System.out.println(); } public static void heap_sort(int[] a) { int len=heapsize; buildMaxHeap(a); for(int i=len;i>1;i--){ System.out.print(a[1]+" "); int temp=a[1]; a[1]=a[i]; a[i]=temp; heapsize--; maxHeapify(a,1); } System.out.println(a[1]); } public static void maxHeapify(int[] a, int i) { int left=i<<1; int right=left+1; int largest=i; if(i<=heapsize/2){ //可以不加 如果i是叶节点就不用进行调整 if(left<=heapsize&&(a[left]>a[i])){ largest=left; } if(right<=heapsize&&(a[right]>a[i])) largest=right; if(largest!=i){ int temp=a[i]; a[i]=a[largest]; a[largest]=temp; maxHeapify(a,largest); } } } public static void buildMaxHeap(int[] a) { for(int i=heapsize/2;i>0;i--){ maxHeapify(a,i); } } }
class heap(object): heapsize=4 def heapsort(self,a): #global heapsize len=s.heapsize s.buildMaxHeap(a) for i in range(len,1,-1): print("%d" %a[1],end=" ") temp=a[1] a[1]=a[i] a[i]=temp s.heapsize-=1 s.maxHeapify(a,1) print("%d\n" %a[1]) def buildMaxHeap(self,a): for i in range(s.heapsize//2,0,-1): s.maxHeapify(a,i) def maxHeapify(self,a,i): left=i<<1 right=left+1 largest=i if i<=s.heapsize//2: if left<=s.heapsize and (a[left]>a[i]): largest=left if right<=s.heapsize and a[right]>a[i]: largest=right if largest!=i: temp=a[i] a[i]=a[largest] a[largest]=temp s.maxHeapify(a,largest) if __name__=="__main__": array=[0,4,2,1,3] s=heap() s.heapsort(array) for i in range(1,5): print("%d " %array[i], end="") print("\n")
**注意 除法取整为双除“//”**Python作用域: