堆排序

堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆(也叫最大堆);或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆(也叫最小堆)。

最小堆和最大堆如下图示:

可以发现:根结点一定是堆中所有结点最大(小)者。

堆排序的基本思想(以大顶堆为例):将待排序的序列构成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构成一个堆,这样就会得到 n 个元素中的次大值。如此反复执行,便能得到一个有序序列了。

堆排序的思想用例图解释如下:

1. 初始最小堆的建立过程(自下向上逐步调整为最小堆)

具体代码如下:

1、排序前的一些准备工作,建立合适的排序需要的结构。

/********* 排序用到的结构  头文件sort_struct.h ************/
#define MAXSIZE 100 //要排序数组个数最大值 class SqList{
public:
int r[MAXSIZE+1];
int length;
}; /* 交换L中数组r下标为i和j的值 */
void swap(SqList *L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
} /* 显示数组内容 */
void showSqList(SqList *L)
{
for(int i=1;i<=L->length;i++)
std::cout<<L->r[i]<<" ";
std::cout<<std::endl;
}

2、编写主文件,实现排序与测试。

/********* C++堆排序算法 ************/
#include<iostream>
#include<time.h>
#include"sort_struct.h"
using namespace std; /* 本函数调整L->r[s]的关键字,使L->r[s...m]成为一个大顶堆 */
void HeapAdjust(SqList *L,int s,int m)
{
int temp,j;
temp = L->r[s];
for(j=2*s;j<=m;j*=2) //沿关键字较大的孩子结点向下筛选
{
if(j<m && L->r[j]<L->r[j+1])
++j; //j为关键字中较大的孩子结点的下标
if(temp>=L->r[j]) //如果关键字均大于孩子结点,跳出
break;
L->r[s] = L->r[j]; //否则交换关键字与较大孩子结点的内容
s = j;
}
L->r[s] = temp; //完成插入
} /* 对顺序表L进行堆排序 */
void HeapSort(SqList *L)
{
int i;
for (i=L->length/2;i>0;i--) //把L中的r构建成一个大顶堆
HeapAdjust(L,i,L->length); for (i=L->length;i>1;i--)
{
swap(L,1,i); //将堆顶记录和当前未经排序子序列的最后一个记录交换
HeapAdjust(L,1,i-1); //将L->r[1...i-1]重新调整为大顶堆
}
} int main()
{
int num[] = {0,50,30,25,15,84,56,34,99,54,111,24,43,6,62,124};
SqList *L = new SqList;
L->length = sizeof(num)/sizeof(int)-1;
for(int i=1;i<=L->length;i++)
L->r[i] = num[i];
cout<<"排序前:";
showSqList(L);
clock_t start = clock();
HeapSort(L);
clock_t end = clock();
double time = ((double)(start-end)) / (double)CLOCKS_PER_SEC * 1000;
cout<<"排序后:";
showSqList(L);
cout<<"耗时:"<<time<<"ms"<<endl;
return 0;
}

运行结果如下:

由于待排序样本太少,耗时显示为0。

C++编程练习(13)----“排序算法 之 堆排序“的更多相关文章

  1. Java常见排序算法之堆排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. Java排序算法之堆排序

    堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...

  3. 排序算法之堆排序(Heapsort)解析

    一.堆排序的优缺点(pros and cons) (还是简单的说说这个,毕竟没有必要浪费时间去理解一个糟糕的的算法) 优点: 堆排序的效率与快排.归并相同,都达到了基于比较的排序算法效率的峰值(时间复 ...

  4. 《排序算法》——堆排序(大顶堆,小顶堆,Java)

    十大算法之堆排序: 堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或k ...

  5. C++编程练习(16)----“排序算法 之 快速排序“

    快速排序 基本思想: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 算法介绍: 设要排序的 ...

  6. 数据结构与算法之PHP排序算法(堆排序)

    一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...

  7. 八大排序算法之七—堆排序(Heap Sort)

    堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...

  8. Python 一网打尽<排序算法>之堆排序算法中的树

    本文从树数据结构说到二叉堆数据结构,再使用二叉堆的有序性对无序数列排序. 1. 树 树是最基本的数据结构,可以用树映射现实世界中一对多的群体关系.如公司的组织结构.网页中标签之间的关系.操作系统中文件 ...

  9. C++编程练习(15)----“排序算法 之 归并排序“

    归并排序 归并排序(Merging Sort)的原理: 假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为1,然后两两归并,得到 [n/2] ([ x ] 表示不小于 ...

随机推荐

  1. 好用的消息对话框-TipsWindown

    TipsWindow的官网地址为:http://leotheme.cn/javascript/jquery-plugins-tipswindow-2-0.html 这个是一个爱好者维护的!在这里感谢这 ...

  2. HUST 1027 Enemy Target!

    求二分图的最小点覆盖集,并输出 对于每一个a[i][j]=1,我们从行i-->列j建立一条边 显然,这张图是一张二分图.左边的节点代表删除哪一行,右边的节点代表删除哪一列.中间的边代表所有a[i ...

  3. Spring--Bean scope

    singleton, prototype,request, session, global session bean.xml: <?xml version="1.0" enc ...

  4. 做自己的串口调试工具-MFC

    之前一共说了几个软件库,串口通讯的,xml加载的,还有动态提示的,通过这三个库就可以实现一个自己的串口调试工具,成品如下 动态加载配置文件之后如下 软件可以在xml中配置发送的字符串,不算是大工程,但 ...

  5. 获取手机wifi下的网络地址

    #import "getIPhoneIP.h" #import <ifaddrs.h> #import <arpa/inet.h> @implementat ...

  6. iOS调用另一个程序

    在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个 ...

  7. X-008 FriendlyARM tiny4412 uboot移植之copy u-boot到DDR内存

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  8. HIDKomponente使用读写Hid设备(转)

    源:HIDKomponente使用读写Hid设备一瞥 HIDKomponente 是delphi中使用的第三方Hid控件库,可以检测.控制连接到电脑的Hid设备.一般情况下多为usb设备. HIDKo ...

  9. Visual Studio Team Services 帐户管理操作

    Visual Studio Team Services 网址: https://www.visualstudio.com/ 1.登陆 2.登陆后新建账户 3.删除团队项目 (1)点击自己的Visual ...

  10. margin的简单应用

    今晚学了盒模型的marg部分,简单仿下京东的官网首页部分 第一次制作,尽管看来实在惨不忍睹,毕竟娘不嫌儿丑,之后多加努力吧,这几天尽量加快学习进度,能单独制作一张精美的网页最好 附上代码 <!D ...