堆排序

View Code
#include <stdio.h>
#include <string.h>
int parent(int i);
int left(int i);
int right(int i);
void max_heapify(int A[],int i);
void bulid_max_heap(int A[]);
void heapSort(int A[]);
int heapSize=0;

int parent(int i){
    return i/2;
}
int left(int i){
    return i*2;
}
int right(int i){
    return i*2+1;
}
void max_heapify(int A[],int i){
    int l=left(i);
    int r=right(i);
    int largest=0;
    if(l<heapSize&&A[i]<A[l]) largest=l;
    else
        largest=i;
    if(r<heapSize&&A[largest]<A[r]) largest=r;
    if(largest!=i){
        int tmp=A[largest];
        A[largest]=A[i];
        A[i]=tmp;
        max_heapify(A,largest);
    }    
}
void bulid_max_heap(int A[]){
    int i=4;                       //(strlen(A)-1)/2;
    for(;i>=1;i--){
        max_heapify(A,i);
    }
}
void heapSort(int A[]){
    int m=9;                      //strlen(A)-1;
    bulid_max_heap(A);
    for(;m>1;m--){
        heapSize=m;
        int tmp=A[m];
        A[m]=A[1];
        A[1]=tmp;
        max_heapify(A,1);
    }
}

int main(){
    int heap[10]={0,6,2,8,1,3,9,4,7,5};
    heapSize=9;
    heapSort(heap);
    int i=0;
    for(;i<10;i++){
        printf("%d ",heap[i]);
    }
    return 0;
}

堆排序中建立一个大堆的时间为o(n),进行排序的时间为o(nlogn)。

堆排序可以处理海量数据,比如在一亿个整数中找到其中最大的100个,可以建立大小为100的小堆,之后逐个放入后面的树进行比较。

posted on 2012-06-04 14:26  蓝色守望  阅读(122)  评论(0)    收藏  举报

导航