1. 程式人生 > >三叉堆實現堆排序

三叉堆實現堆排序

col ios size vat spa pub urn include %d

 1 /*
 2 手寫三叉堆 
 3 */
 4 #include<cstdio>
 5 #include<iostream>
 6 using namespace std;
 7 
 8 class heap3{
 9     private:
10         int heap[100001];
11         int heap_size;
12     public:
13         void put(int d);
14         int get();
15         int getsize();
16         void
in(int x,int y); 17 void out(int n); 18 }; 19 20 heap3 m; 21 22 void heap3::out(int n){ 23 for(int k=1;k<=n;++k) cout<<heap[k]<< ; 24 } 25 26 void heap3::in(int x,int y){heap[x]=y;} 27 28 void heap3::put(int d) 29 { 30 heap[++heap_size]=d; 31 int
now=heap_size,next; 32 33 while(now>1) 34 { 35 next=(now+1)/3; 36 if(heap[now]<=heap[next]) break; 37 swap(heap[now],heap[next]); 38 now=next; 39 } 40 41 return; 42 } 43 44 int heap3::getsize(){return heap_size;} 45 46 int
heap3::get(){ 47 48 int now=1,next; 49 int res=heap[1]; 50 heap[1]=heap[heap_size--]; 51 52 while(now*3-1 <= heap_size) 53 { 54 next=now*3-1; 55 56 if(next+1<=heap_size && heap[next+1]>heap[next]){ 57 next++; 58 59 if(next+1<=heap_size && heap[next+1]>heap[next]) next++; 60 } 61 else 62 if(next+2<=heap_size && heap[next+2]>heap[next]) next+=2; 63 64 if(heap[now]>=heap[next]) break; 65 66 swap(heap[now],heap[next]); 67 now=next; 68 } 69 return res; 70 } 71 72 int main(){ 73 int n,x; 74 scanf("%d",&n); 75 for(int i=1;i<=n;++i){ 76 scanf("%d",&x); 77 m.put(x); 78 } 79 80 for(int i=1;i<n;++i){ 81 int k=m.getsize(); 82 m.in(k,m.get()); 83 } 84 85 m.out(n); 86 87 return 0; 88 }

解釋先鴿著

三叉堆實現堆排序