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

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

利用建好的堆进行排序:

CODE:

1 #include < iostream >
2   using namespace 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 } else break ;
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 return 0 ;
63 }

 

转载于:https://www.cnblogs.com/penseur/archive/2011/03/19/1988597.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值