数据结构排序3-堆排序
堆排序
思想:假设数组放入完全二叉树中,
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-堆排序相关推荐
- 数据结构排序法之堆排序he归并排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 堆排序的时间,主要由建立初始 ...
- 数据结构—排序算法总结(插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、合并排序、计数排序)
*排序 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 稳定性 在待排序的数组中,如果出现多个相同的关键字,例如:98751555512,中出现重复的数字,在 ...
- 【数据结构-排序】3.图解选择排序两种实现(简单选择排序/堆排序)
简单选择排序(选择排序) 排序思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 以此类推,直到所有元素 ...
- 数据结构之选择排序:堆排序
选择排序:堆排序 思维导图: 堆的概念: 堆的初始化: 堆排序的算法思想: 堆排序代码实现: 堆排序的插入: 堆排序的删除: 堆排序的性能: 思维导图: 堆的概念: 根>=左右孩子节点的顺序存储 ...
- 选择排序稳定吗_最常见的四种数据结构排序算法你不知道?年末怎么跳槽涨薪...
前言 在学习数据结构的时候必然接触过排序算法,而且在日常开发中相信排序算法用得也比较多.而排序算法众多,各个效率又不同,难以记住.小编今天会介绍一些常用排序算法的特点和实现,对比不同排序算法的效率. ...
- java数据结构排序实验报告_java数据结构与算法之插入排序详解
本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...
- 数据结构与算法 | 堆排序
堆排序 在上一章节里我们完成了堆的实现和基本操作:https://blog.csdn.net/qq_35423154/article/details/104598702 这里就顺带讲一讲堆排序 堆排序 ...
- 数据结构---排序算法的总结
数据结构-排序算法的总结 分类 冒泡排序,时间复杂度O(n x n),空间复杂度O(1),稳定 简单选择排序,时间复杂度O(n x n),空间复杂度O(1),不稳定 希尔排序,时间复杂度O(n^1.3 ...
- 数据结构----------实现最小堆排序
数据结构----------实现最小堆排序 原理: 来源于---------------趣学数据结构 代码: #include<stdio.h> #include<stdlib.h& ...
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
最新文章
- 二十一、深入Python强大的装饰器
- 人生财富值得珍藏的文字
- Git cherry-pick后再merge出现一个“奇怪”的现象
- mysql config.path_mysql之 mysql_config_editor/login-path 登录密码保护
- 吴恩达《机器学习》第十一章:机器学习系统的设计
- 判断三个数是否能构成三角形_【内含干货】611. 有效三角形的个数
- 硬件-电子基础元器件(一)电阻
- 白菜萝卜的做法 - 凉拌菜
- 新华财经•专访 | 来自大洋彼岸对区块链大势的深度解读
- Docker的中央仓库
- python read()读取图片_可以python sitk.ReadImage读取列表/系列图像吗?
- token 中有效期设置
- 简易漫画网站搭建-漫画喵Server版
- Objective-C 编程语言官网文档(一)-简介
- 每日一道Leetcode - 剑指 Offer 14- I. 剪绳子【动态规划】
- 2021-2027全球及中国M2M应用开发平台行业研究及十四五规划分析报告
- 深入浅出 Kubernetes 网络模型基础指南
- 北大青鸟深圳嘉华分享MySQL基础知识
- GetGestureInfo 函数-中文整理
- java知识体系整理(二)JVM、GC回收及调优
热门文章
- Java微服务篇3——Lucene
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyR
- java put set_Java PutItemRequest.setItem方法代码示例
- ddr2的上电顺序_关于内存的插入顺序的问题
- python批量图片转pdf,用python 制作图片转pdf工具
- php unserialize 实例,PHP ArrayIterator unserialize()用法及代码示例
- java整数翻转_Java程序反转数字
- 扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品
- 分布式事务的解决思路与方案
- 计算机拆卸组装过程,如何拆卸并重新组装笔记本电脑