Heap Sort
来源:互联网 发布:淘宝刷钻网站 编辑:程序博客网 时间:2024/06/07 12:49
Heap Sort
一、堆
1、(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左向右填充。
2、在堆排序算法中,我们使用的是最大堆。最小堆通常用于构造优先队列。
3、如果把堆看成是一颗树,我们定义一个堆中的结点的高度就为该结点到叶结点最长简单路径上边的数目。进而我们可以把堆的高度定义为根节点的高度。
二、维护堆的性质
伪代码:
Max_Heapify(A,i){ l=LEFT(i); r=RIGHT(i); if(l<=A.heap_size && A[l]>A[i]) largest=l else largest=i; if(r<=A.heap_size && A[r]>largest) largest=r; if(largest != i) exchange A[i] with A[largest] Max_Heapify(A,largest)}
源代码:
void Max_Heapify(int a[],int i,int size){ int left=2*i; int right=2*i+1; int largest; if(left<=size && a[left]>a[i]) largest=left; else largest=i; if(right<=size && a[right]>a[largest]) largest=right; if(largest!=i) { swap(a[i],a[largest]); Max_Heapify(a,largest,size); }}时间复杂度:O(logN)
三、建堆
当用数组表示存储n个元素的堆时,叶结点下标分别是|_ n/2 _|+1,|_ n/2 _|+2,...,n.
每个叶结点都可以看成只包含一个元素的堆。过程Build_Max_Heap对树中的其他结点都自底向上调用一次Max_Heapify.
伪代码:
Build_Max_Heap(A){ A.heap_size = A.length; for i=|_ A.length/2 _| downto 1 Max_Heapify(A,i);}
源代码:
void Build_Max_Heap(int a[],int size){ int i; for(i=size/2;i>=1;i--) Max_Heapify(a,i,size);}
<span style="font-family:KaiTi_GB2312;font-size:24px;">时间复杂度:O(N)</span>
四、堆排序算法
伪代码:
Heap_Sort(A){ Build_Max_Heap(A); for i=A.length downto 2 exchange A[1] with A[i]; A.heap_size=A.heap_size - 1; Max_Heapify(A,1);}
源代码:
void Heap_Sort(int a[],int size){ int i; Build_Max_Heap(a,size); for(i=size;i>=2;i--) { swap(a[1],a[i]); size=size-1; Max_Heapify(a,1,size); }}
时间复杂度:0(N*logN)
五、完整源代码:
1 //MAX_HEAP SOTR ALGORITHM 2 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 void Max_Heapify(int a[],int i,int size) 8 { 9 int left=2*i; 10 int right=2*i+1; 11 int largest; 12 if(left<=size && a[left]>a[i]) 13 largest=left; 14 else 15 largest=i; 16 if(right<=size && a[right]>a[largest]) 17 largest=right; 18 if(largest!=i) 19 { 20 swap(a[i],a[largest]); 21 Max_Heapify(a,largest,size); 22 } 23 } 24 25 void Build_Max_Heap(int a[],int size) 26 { 27 int i; 28 //int size=sizeof(a)/sizeof(int); 29 for(i=size/2;i>=1;i--) 30 Max_Heapify(a,i,size); 31 } 32 33 void Heap_Sort(int a[],int size) 34 { 35 int i; 36 Build_Max_Heap(a,size); 37 for(i=size;i>=2;i--) 38 { 39 swap(a[1],a[i]); 40 size=size-1; 41 Max_Heapify(a,1,size); 42 } 43 } 44 45 int main() 46 { 47 int i; 48 int len; 49 int a[100]; 50 cout<<"Please input the length and a[]:"<<endl; 51 while(cin>>len) 52 { 53 for(i=1;i<=len;i++) 54 cin>>a[i]; 55 //int size=sizeof(a)/sizeof(int); 56 //cout<<size; 57 Heap_Sort(a,len); 58 for(i=1;i<=len;i++) 59 cout<<a[i]<<" "; 60 cout<<endl; 61 } 62 return 0; 63 }
六、测试结果
0 0
- Heap Sort
- Heap Sort
- heap sort
- heap sort
- Heap Sort
- heap sort
- heap sort
- heap sort
- Heap-Sort
- Heap-sort
- Heap sort
- Heap Sort
- Heap Sort
- heap sort
- Heap Sort
- Heap Sort
- Heap Sort
- heap and heap sort
- thinkphp框架中“关联操作”的完整定义详解
- 燕子bt下载无障碍
- HDU 1495 非常可乐 泊松分酒问题
- 解决Struts2.2.20版本的标签不支持style属性的问题
- 判断一本书是否为好书的方法
- Heap Sort
- 刚注册的,感觉好负责啊
- MFC 实现 加减乘除,括号,乘方的 计算器
- 一些项目——猴子吃桃问题
- Unity3d资源反编译. AssetBundle格式简析+简单应用+爬坑
- linux下使用g++编译器和windows下使用cl编译器
- iOS实现图片自动轮播展示
- Beginners Level Course: What is Linux?
- PolyBase中的拆分查询处理