1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 //小根堆 6 void heapAdd(int a[],int i,int num)//添加 7 { 8 a[i]=num; 9 for(int j=i>>1;j&&i&&a[i]<a[j];i=j,j>>=1) 10 swap(a[i],a[j]); 11 } 12 void heapDown(int a[],int i,int n)//恢复 13 { 14 for(int j=i<<1;j<=n&&a[i]>a[j];i=j,j<<=1) 15 { 16 if(j+1<=n&&a[j+1]<a[j]) j++; 17 swap(a[i],a[j]); 18 } 19 } 20 void heapDel(int a[],int n)//删除 21 { 22 swap(a[1],a[n]); 23 heapDown(a,1,n); 24 } 25 void makeHeap(int a[],int n)//构建 26 { 27 for(int i=n/2;i;--i) 28 heapDown(a,i,n); 29 } 30 void heapSort(int a[],int n)//堆排序 31 { 32 for(int i=n;i;--i) 33 { 34 swap(a[i],a[1]); 35 heapDown(a,1,i-1); 36 } 37 } 38 int main() 39 { 40 int a[12]={0,1,6,4,3,8,2}; 41 makeHeap(a,6); 42 heapAdd(a,7,5); 43 heapSort(a,7); 44 for(int i=1;i<=7;i++) 45 printf("%d%c",a[i],i==7?‘\n‘:‘ ‘); 46 return 0; 47 }
注意:使用小根堆排序后是递减数组,要得到递增数组,可以使用大根堆。
在堆排序好后再添加元素,需要重新建堆并且排序。
由于每次重新恢复堆的时间复杂度为O(logN),共N - 1次重新恢复堆操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。二次操作时间相加还是O(N * logN)。故堆排序的时间复杂度为O(N * logN)。
参考文章:http://blog.csdn.net/morewindows/article/details/6709644/
时间: 2024-10-14 20:26:30