码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序模板

时间:2016-04-23 11:45:07      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

 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/

堆排序模板

标签:

原文地址:http://www.cnblogs.com/L-King/p/5424089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!