堆排序
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的小堆,之后逐个放入后面的树进行比较。

浙公网安备 33010602011771号