编程练习13

 1 //------------------------------------------------------------------
 2 //堆排序:关键是堆的构建和堆的调整,而堆的构建本质上也是堆的调整
 3 //------------------------------------------------------------------
 4 #include <iostream>
 5 using namespace std;
 6 
 7 void swap(int* a,int* b)
 8 {
 9     if(*a!=*b)
10     {
11         *a=*a^*b;
12         *b=*a^*b;
13         *a=*a^*b;
14     }
15 }
16 //----------------------------------|||||||||||----------------------------------------------------
17 //----------------------------------华丽的分割线---------------------------------------------------
18 //----------------------------------|||||||||||----------------------------------------------------
19 void heapadjust(int* arr,int num,int pos)  //堆的一次调整过程:从pos位置开始调整
20 {
21     int i=pos,j=2*i+1;           
22     if(j<=num)                             //左儿子节点非叶子节点
23     {
24         if(j==num)                         //这种情况是左儿子节点恰好是最后一个节点
25         {
26             if(arr[i]<arr[j])              
27                 swap(&arr[i],&arr[j]);     //到底了,那就直接交换,没必要再往下调整
28         }
29         else
30         {
31             if(arr[i]<arr[j] && arr[j]>arr[j+1])     //左儿子节点更大
32             {
33                 swap(&arr[i],&arr[j]);               
34                 heapadjust(arr,num,j);                 //往下继续调整
35             }
36             else if(arr[i]<arr[j+1] && arr[j+1]>arr[j]) //右儿子节点更大
37             {
38                 swap(&arr[i],&arr[j+1]);                
39                 heapadjust(arr,num,j+1);                //往下继续调整
40             }
41         }
42 
43     }
44 
45 }
46 //----------------------------------|||||||||||----------------------------------------------------
47 //----------------------------------华丽的分割线---------------------------------------------------
48 //----------------------------------|||||||||||----------------------------------------------------
49 void heapbuild(int* arr,int num)  //构建堆,其实也是堆的调整过程
50 {
51     for(int i=(num-1)/2;i>=0;--i) //从非叶子节点开始调整
52         heapadjust(arr,num,i);
53 }                                                                  
54 
55 void heapsort(int* arr,int num)
56 {
57     int n=num;
58     heapbuild(arr,num);           //先构建好一个最大堆
59 
60     while(num)
61     {
62         swap(&arr[0],&arr[num]);  //根节点出列
63         num--;
64         heapadjust(arr,num,0);    //堆的调整过程:从根节点开始
65     }
66 }
67 void print(int* arr,int n)
68 {
69     for(int i=0;i<=n;++i)
70         cout<<arr[i]<<" ";
71 }
72 //----------------------------------|||||||||||----------------------------------------------------
73 //----------------------------------华丽的分割线---------------------------------------------------
74 //----------------------------------|||||||||||----------------------------------------------------
75 int main()
76 {
77     int arr[]={3,6,0,7,22,19,8,9,0,3,18,3,19};
78     int num=sizeof(arr)/sizeof(int);
79     
80     if(num<=1) goto end;
81     heapsort(arr,num-1);
82 end:
83     print(arr,num-1);
84     cout<<endl;
85 
86     return 0;
87 }

 

堆排序,近两个小时才完成,我 ,真崩溃!!

 

posted on 2012-09-15 14:44  lyncre  阅读(140)  评论(0)    收藏  举报

导航