堆排序的意义并不在于排序本身(图示+代码)

(二叉)堆是一种特殊的数据结构.
:(二叉)堆数据结构是一种数组对象,它可以被视为一种完全二叉树
:树中的每个节点与数组中存放该节点值的那个元素对应。树的每一层都是填满的,最后一层除外.
:(二叉)堆的用途很广,例如典型的运用--优先队列|堆排序{速度比快速排序慢,比插入排序块O(nlg(n))}
:下面我用一个比较通俗易懂的程序以及相关图解来演示一下如何建堆,如何利用堆进行排序
小贴士:*读者如果细细品味,能发现堆排序就是在利用优先队列进行排序,
    *另外优先队列在dijkstra算法与A*算法中具有十分重要的应用
      *所以只有先弄懂了(二叉)堆才能知道优先队列的工作原理,然后才能更加游刃有余的实现(dijkstra算法|A*)
    *这才是我最想说的,嘻嘻
图解:数据均为程序中出现的数据
建堆的过程

利用建好的堆进行排序:

CODE:

1 #include<iostream>
2  usingnamespace std;
3 #define Maxn 20
4 #define cop(a,b) ((a)>(b))//定义比较
5 struct Heap_t
6 {
7 int c[Maxn],t;//t为堆中的元素个数,c为数据源
8 Heap_t(){t=0;}
9 void up(int k)//向上移动
10 {
11 while(k>1&&cop(c[k],c[k>>1]))
12 {
13 swap(c[k],c[k>>1]);
14 k>>=1;
15 }
16 }
17 void down(int k)//向下移动
18 {
19 int p;
20 while((k<<1)<=t)
21 {
22 p=k<<1;
23 p+=(p<t&&cop(c[p+1],c[p]));
24 if(cop(c[p],c[k]))
25 {
26 swap(c[p],c[k]);k=p;
27 }elsebreak;
28 }
29 }
30 void push(int e)//进堆
31 {
32 t++;
33 c[t]=e;
34 up(t);
35 }
36 void pop()//出堆
37 {
38 swap(c[1],c[t]);
39 t--;
40 down(1);
41 }
42 int top()//取堆顶元素
43 {
44 return c[1];
45 }
46 bool empty()//判断是否为空
47 {
48 return (t==0?true:false);
49 }
50 }Heap;
51 int main()
52 {
53 int sou[6]={9,4,12,6,3,9};
54 for(int i=0;i<6;i++)
55 Heap.push(sou[i]);//进堆
56 while(!Heap.empty())//当为空时出堆
57 {
58 printf("%d ",Heap.top());//优先队列思想,每次都取队列中的最大的元素
59 Heap.pop();//出堆
60 }
61 printf("\n");
62 return0;
63 }

 

posted @ 2011-03-19 09:37  Penseur  阅读(4212)  评论(2编辑  收藏  举报