现在的位置: 首页 > 综合 > 正文

heapsort堆排序(3种语言实现 c/java/python)

2013年12月07日 ⁄ 综合 ⁄ 共 2402字 ⁄ 字号 评论关闭
#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作用域

 


抱歉!评论已关闭.