【算法导论】堆排序

 

此文章已于 19:56:03 2015/5/7 从新发布到 Feeeios

【算法导论】堆排序算法

 

 

堆排序的原理:数组

    构建而且维持一个最大堆,而后交换堆的第一个和最后一个元素,每次交换后最大的元素都被移到最后。而后堆的规模减一,继续交换,直到进行到第二个元素。这时排序完成ui

图解:(图片来源于http://blog.163.com/zhoumhan_0351/blog/static/399542272009918112712205/spa

                       

堆排序的过程:code

1,     维持最大堆,Max_heap过程用于维护最大堆的性质。blog

  Max_heap(A,i)排序

      L = 2 * i图片

       R = 2 * 1 + 1get

     If L < size and A[L]>A[i]

          Largest = l

       Else

          Largest = i

       If R < size and A[R]>A[i]

          Largest = R

       If Largest != i

          Exchange(A[i],A[Largest])

          Max_heap(A,Largest)

2,     创建最大堆,该过程从size/2开始(之后的元素都没有左右子树),向上使用Max_heap,使整个对成为一个最大堆

    Build_heap(A)

         For i = size / 2 to 1

           Max_heap(A,i)

3,     堆排序

    Heap_sort(A)

      Build_heap(A)

      For i = size to 2

           Exchange(A[1],A[i])

           size = size -1

           Max_heap(A,1)

算法分析:

维持一个最大堆的复杂度为Ɵ(lgN),创建一个最大堆的复杂度为Ɵ(N),Heap_sort过程调用了一次Build_Heap, n-1次Max_Heap。总的复杂度为Ɵ(N'l'g'N)

 

C++源代码:

 

 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 //维护堆的性质,使堆都能维持为最大堆 
 7 void Max_Heap(int *a,int i,int size)
 8 { 
 9     int l = 2 * i + 1;     //获得左孩子 ,因为数组下标从0开始,因此左孩子为2*i+1 
10     int r = 2 * i + 2;     //获得右孩子 
11     int max;        
12     
13     if(l <= size-1 && a[l] > a[i]){
14             max = l;
15     }
16     else
17         max = i;
18     if(r <= size-1 && a[r] > a[max]){
19             max = r;
20     }
21     if(max != i){
22         swap(a[i],a[max]);
23         Max_Heap(a,max,size);
24     }
25 }
26 
27 void HeapBUild(int *a,int size){
28     int i;
29     for(i = size/2-1;i>=0;i--){
30         Max_Heap(a,i,size);
31     }
32 }
33 
34 void HeapSort(int *a,int size){
35     int i;
36     HeapBUild(a,size);
37     for(i=size-1;i>0;i--){
38         swap(a[0],a[i]);
39         Max_Heap(a,0,i);
40     }
41 }
42 
43 int main(int argc,char *argv[]){
44     int i;
45     int a[]={2,3,1,4,6,7,5};
46     int size = 7;
47     HeapSort(a,size);
48     for(i = 0; i < size; i++)
49         cout<<a[i]<<" ";
50     return 0;
51 }
相关文章
相关标签/搜索