堆排序

思想:假设数组放入完全二叉树中,

1、初始化堆:调节父结点与子结点的大小。让所有的子结点都小于父结点。

2、将完全二叉树中的叶子结点和根结点进行互换后,继续调整堆。直至结束

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<random>
#include<time.h>
#include<sys/timeb.h>
using namespace std;
#define MAX 9long getSystemTime()
{struct timeb tb;ftime(&tb);return tb.time * 1000 + tb.millitm;  //毫秒
}void printArr(int arr[], int length)
{for (int i = 0; i < length; i++){printf("%d ", arr[i]);}printf("\n");
}
void swapElementme(int* a, int* b)
{int temp =*a;*a = *b;*b = temp;
}//堆排序
void heapSortme(int arr[], int length)
{int mid = length / 2 - 1;int lchild = mid * 2 + 1;int rchild = mid * 2 + 2;int max = mid;//初始化堆for (int i = mid; i < length; i--)  {if (arr[i] < arr[lchild]){max = lchild;}if (arr[mid] > arr[rchild]){max = rchild;}if (max != mid){swapElementme(&arr[mid], &arr[max]);}}for (int i = 0; i < length; i++){swapElementme(&arr[0], &arr[length - 1]);heapSortme(arr, length);}
}void swapElement(int arr[], int a, int b)
{int temp = arr[a];arr[a] = arr[b];arr[b] = temp;
}
/*@param arr 待调整的数组@param index 待调整的结点的下标@param length 数组长度
*/
void heapAdjust(int arr[],int index, int length)
{//保存当前结点的下标int max = index;//保存右孩子的数组下标int lchild = index * 2 + 1;//保存左孩子的数组下标int rchild = index * 2 + 2;if (lchild<length && arr[lchild]>arr[max]){max = lchild;}if (rchild<length && arr[rchild]>arr[max]){max = rchild;}if (max != index){//交换两个结点swapElement(arr, max, index);heapAdjust(arr, max, length);}}
void heapSort(int arr[], int length)
{//初始化堆for (int i = length/2-1; i >=0; i--){heapAdjust(arr, i, length);}//交换堆顶元素和最后一个元素for (int i = length-1; i >= 0; i--){swapElement(arr, 0,i);heapAdjust(arr, 0, i);}
}int main()
{int arr[] = { 4,2,8,0,5,7,1,3,9};long t_start = getSystemTime();printArr(arr,MAX);heapSort(arr,MAX);printArr(arr, MAX);long t_end = getSystemTime();printf("堆排序%d个元素,所需时间:%1d\n", MAX, t_end - t_start);system("pause");return 0;
}

运行结果:
 

数据结构排序3-堆排序相关推荐

  1. 数据结构排序法之堆排序he归并排序

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的时间,主要由建立初始 ...

  2. 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)

    *排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...

  3. 【数据结构-排序】3.图解选择排序两种实现(简单选择排序/堆排序)

    简单选择排序(选择排序) 排序思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 以此类推,直到所有元素 ...

  4. 数据结构之选择排序:堆排序

    选择排序:堆排序 思维导图: 堆的概念: 堆的初始化: 堆排序的算法思想: 堆排序代码实现: 堆排序的插入: 堆排序的删除: 堆排序的性能: 思维导图: 堆的概念: 根>=左右孩子节点的顺序存储 ...

  5. 选择排序稳定吗_最常见的四种数据结构排序算法你不知道?年末怎么跳槽涨薪...

    前言 在学习数据结构的时候必然接触过排序算法,而且在日常开发中相信排序算法用得也比较多.而排序算法众多,各个效率又不同,难以记住.小编今天会介绍一些常用排序算法的特点和实现,对比不同排序算法的效率. ...

  6. java数据结构排序实验报告_java数据结构与算法之插入排序详解

    本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...

  7. 数据结构与算法 | 堆排序

    堆排序 在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702 这里就顺带讲一讲堆排序 堆排序 ...

  8. 数据结构---排序算法的总结

    数据结构-排序算法的总结 分类 冒泡排序,时间复杂度O(n x n),空间复杂度O(1),稳定 简单选择排序,时间复杂度O(n x n),空间复杂度O(1),不稳定 希尔排序,时间复杂度O(n^1.3 ...

  9. 数据结构----------实现最小堆排序

    数据结构----------实现最小堆排序 原理: 来源于---------------趣学数据结构 代码: #include<stdio.h> #include<stdlib.h& ...

  10. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

最新文章

  1. 二十一、深入Python强大的装饰器
  2. 人生财富值得珍藏的文字
  3. Git cherry-pick后再merge出现一个“奇怪”的现象
  4. mysql config.path_mysql之 mysql_config_editor/login-path 登录密码保护
  5. 吴恩达《机器学习》第十一章:机器学习系统的设计
  6. 判断三个数是否能构成三角形_【内含干货】611. 有效三角形的个数
  7. 硬件-电子基础元器件(一)电阻
  8. 白菜萝卜的做法 - 凉拌菜
  9. 新华财经•专访 | 来自大洋彼岸对区块链大势的深度解读
  10. Docker的中央仓库
  11. python read()读取图片_可以python sitk.ReadImage读取列表/系列图像吗?
  12. token 中有效期设置
  13. 简易漫画网站搭建-漫画喵Server版
  14. Objective-C 编程语言官网文档(一)-简介
  15. 每日一道Leetcode - 剑指 Offer 14- I. 剪绳子【动态规划】
  16. 2021-2027全球及中国M2M应用开发平台行业研究及十四五规划分析报告
  17. 深入浅出 Kubernetes 网络模型基础指南
  18. 北大青鸟深圳嘉华分享MySQL基础知识
  19. GetGestureInfo 函数-中文整理
  20. java知识体系整理(二)JVM、GC回收及调优

热门文章

  1. Java微服务篇3——Lucene
  2. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyR
  3. java put set_Java PutItemRequest.setItem方法代码示例
  4. ddr2的上电顺序_关于内存的插入顺序的问题
  5. python批量图片转pdf,用python 制作图片转pdf工具
  6. php unserialize 实例,PHP ArrayIterator unserialize()用法及代码示例
  7. java整数翻转_Java程序反转数字
  8. 扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品
  9. 分布式事务的解决思路与方案
  10. 计算机拆卸组装过程,如何拆卸并重新组装笔记本电脑