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

堆排序

时间:2017-03-31 16:32:23      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:after   make   例子   cst   else   ext   bsp   span   小根堆   

堆排序

 

 

#include<iostream>
#include<vector> 
#include<algorithm>
using namespace std;
int heap[1000];
int heap_size=0;
void put(int d)                 //heap[1]为堆顶
{
    int now, next;
    heap[++heap_size] = d;
    now = heap_size;
    while(now > 1)
    {
        next = now >> 1;
        if(heap[now] >= heap[next]) break;
        swap(heap[now], heap[next]);
        now = next;
    }
}
/*void put(int d)
{
    heap[++heap_size] = d;
    //push_heap(heap + 1, heap + heap_size + 1);            //大根堆
    push_heap(heap + 1, heap + heap_size + 1, greater<int>()); //小根堆
}*/
int get()                //heap[1]为堆顶
{
    int now=1, next, res= heap[1];
    heap[1] = heap[heap_size--];
    while(now * 2 <= heap_size)
    {
        next = now * 2;
        if (next < heap_size && heap[next + 1] < heap[next]) next++;
        if (heap[now] <= heap[next]) break;
        swap(heap[now], heap[next]);
        now = next;
    }
    return res;
}
int main()
{
    int i=0;
    while(cin>>heap[++i]){
        put(heap[i]);
    }
    for(int j=1;j<i;++j){
        cout<<heap[1]<<" ";get();
    } 
    return 0;
}
//3 5 1 7 6 4 2 5 4 1

 

 

 1 /* 介绍algorithm头文件中根的相关函数 
 2     make_heap(首位置, 尾位置+1, 可选的cmp函数); -> 构造堆 
 3     push_heap(首位置, 尾位置+1, 可选的cmp函数); -> 添加元素到堆中 
 4     pop_heap(首位置, 尾位置+1, 可选的cmp函数);  -> 从堆中移出元素 
 5     sort_heap(首位置, 尾位置+1, 可选的cmp函数); -> 整个堆进行排序 
 6 */
 7 
 8 #include<algorithm>
 9 #include<cstdio>
10 using namespace std;
11 
12 bool inc_cmp(int a,int b){ return a > b; }
13 // 可以理解为:左a右b,当a>b的时候,双方交换位置,
14 // 所以上式这个cmp意为从小到大(排序)。 
15 
16 bool des_cmp(int a, int b){ return a < b; }
17 
18 int num[10]={3, 1, 2, 5, 6, 4};
19 
20 int main()
21 {    
22     make_heap(num, num+6);//构造一个堆,默认是大根堆。 
23                             // 上式等价于make_heap(&num[0], &num[6]);可以看到,区间是[0, 7),
24                             // 即参数中的末尾是真真实末尾的后一个位置。
25                             // 可以修改为make_heap(num, num+6, inc_cmp); 此时为小根堆。 
26                             
27                             // 插入一个元素到先前创建的堆中,插进来的数将调整到合适的位置。 
28     num[6] = 5;
29     push_heap(num, num+7);
30     
31                             // pop_heap将堆顶数据移动到末尾位置,然后将剩余数据重新构造堆。
32                             // 其中一个易于理解的例子就是,不断将大根堆堆顶移到末尾,
33                             // 以此模拟从小到大排序。 
34                             
35                             /* ---------- */ 
36     printf("before: "); 
37     for(int i = 0; i < 7; i++)
38         printf("%d ", num[i]);
39     printf("\n");
40     
41     for(int i = 7; i >= 1; i--) // 共7个数,交换到最后第二个数为止。 
42     {
43         pop_heap(num, num+i);
44     }
45     
46     printf("after : "); 
47     for(int i = 0; i < 7; i++)
48         printf("%d ", num[i]);
49     printf("\n");
50     /* ---------- */ 
51     
52     //sort_heap,堆排序,因为前面都pop_heap掉了,所以得重新make_heap
53     make_heap(num, num + 6); 
54     sort_heap(num, num+6, des_cmp);
55     for(int i = 0; i < 7; i++)
56         printf("%d ", num[i]);
57     printf("\n");
58     return 0;
59 }

//堆排3

 1 #include<iostream>
 2 using namespace std;
 3 int d[1000];
 4 int n,i,total,tmp;
 5 void down(int i)
 6 {
 7     int t,j;
 8     while(i<=total/2)
 9         {
10             j=2*i;
11             if((j<total)&&(d[j+1]<d[j])) j=j+1;
12             if(d[i]>d[j]) 
13                {
14                    t=d[i]; d[i]=d[j]; d[j]=t;
15                    i=j;
16                }
17             else break;
18         }
19     
20 }
21 int main()
22 {
23     cin>>n;
24     for (i=1;i<=n;i++) cin>>d[i];
25     total=n;
26     for(i=n/2;i>=1;i--) down(i);
27     for(i=1;i<=n;i++)
28         {
29             tmp=d[1];d[1]=d[total];d[total]=tmp;
30             total=total-1;
31             down(1);
32         }
33     for(i=n;i>=1;i--) cout<<d[i]<<" ";
34 }

 

堆排序

标签:after   make   例子   cst   else   ext   bsp   span   小根堆   

原文地址:http://www.cnblogs.com/mjtcn/p/6651978.html

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