/*
建议先看堆调整方法,堆调整了解了,整个排序算法就算掌握了
*/
- (void)viewDidLoad
{
[super viewDidLoad]; /*
测试数据
*/
NSArray *array=@[@,@,@,@,@,@,@,@,@]; NSMutableArray *mutable=[NSMutableArray arrayWithArray:array]; mutable=[self createMaxHeap:mutable]; NSInteger num=mutable.count; /*
剩余的元素个数不为1时则继续调整,取出元素。取出的元素放在最后的一个节点。然后减小堆的元素的个数。所以大顶堆排序出来的是升序的。
*/
while (num>)
{
[mutable exchangeObjectAtIndex: withObjectAtIndex:num-]; mutable=[self maxHeapAdjust:mutable index: length:num-];
num--;
}
} /*
调整堆 递归调整的过程。这个调整堆的方法传入的是待调整的数组,数组元素的长度(为什么不直接用array.count呢?因为再进行排序
的时候,我们会动态更改无序堆的长度,而array的长度确是不变的,所以不用array.cout) 其实每调用一次调整堆方法,我们相当于只调整3个元素:父节点,左、右子节点。当左子结点是三者中最大的时候,把它和父节点进行交换。然后再递归调整以刚才的父节点(现在被降级为左子节点)为父节点的三个节点。此时为什么不用调整右子节点呢?这是由于我们建立大顶堆的过程中,都是自下而上进行调整的,此时我们没有动右子节点,且右子节点和现在的父节点(原来的左子节点)满足大顶堆的条件,所以不用调整。
*/
-(NSMutableArray*)maxHeapAdjust:(NSMutableArray *)array index:(NSInteger)index length:(NSInteger)length
{
NSInteger leftChildIndex =index*+;//获取该节点的左子节点索引
NSInteger rightChildIndex=index*+;//获取该节点的右子节点索引
NSInteger maxValueIndex=index;//暂时把该索引当做最大值所对应的索引 // leftChildIndex<length你
//array[leftChildIndex]>array[maxValueIndex] 判断左子节点的值是否大于当前最大值
if (leftChildIndex<length && array[leftChildIndex]>array[maxValueIndex])
{
//把左子节点的索引作为最大值所对应的索引
maxValueIndex=leftChildIndex;
}
// rightChildIndex<length
//array[leftChildIndex]>array[maxValueIndex] 判断左子节点的值是否大于当前最大值
if (rightChildIndex<length && array[rightChildIndex]>array[maxValueIndex])
{
maxValueIndex=rightChildIndex;
} //如果该节点不是最大值所在的节点 则将其和最大值节点进行交换
if (maxValueIndex!=index)
{
[array exchangeObjectAtIndex:maxValueIndex withObjectAtIndex:index]; //递归乡下调整,此时maxValueIndex索引所对应的值是 刚才的父节点。
array=[self maxHeapAdjust:array index:maxValueIndex length:length];
} return array;
} -(NSMutableArray*)createMaxHeap:(NSMutableArray*)array
{ /*
从最后一个非叶子节点开始 自下而上进行调整堆
*/
for (NSInteger i=(array.count/-);i>=; --i)
{
array=[self maxHeapAdjust:array index:i length:array.count] ;
} return array;
}

堆排序的OC实现的更多相关文章

  1. OC 实现的几个排序算法

    和在VC++6.0里相比 在OC里面实现 不算困难 可是我用惯了C/C++呢 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序 /******************** ...

  2. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  3. 算法与数据结构(十四) 堆排序 (Swift 3.0版)

    上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  6. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  7. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  8. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  9. 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序

    #!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...

随机推荐

  1. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...

  2. glusterfs repo

    Installing Gluster For RPM based distributions, if you will be using InfiniBand, add the glusterfs R ...

  3. echarts 折线柱形上方显示自定义格式数据

    series:[ { name: '成单率', type: 'line', data: valueArr2, itemStyle: { normal: { label: { show:true, po ...

  4. Filter案例

    1.有选择的被访问 描述:首先若用户没有在页面提交注册(直接访问list.jsp),就只能被允许访问a.jsp.其他页面均不被允许访问 在login.jsp提交信息之后,可以在b.jsp访问, 代码如 ...

  5. 设置tomcat内存

    设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4. 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 三.实例,以下给 ...

  6. Android Studio-ApplicationId 与 PackageName

    BuildType 中所设置的『applicationIdSuffix』属性,按照这个属性的字面翻译为:『applicationId 的后缀』 Android 应用都有自己的包名.包名是设备上每个应用 ...

  7. 台湾书籍代购网址——2013-08-25 16

    台湾书籍代购 博客来http://www.books.com.tw 三民http://www.sanmin.com.tw 诚品http://www.eslite.com 金石堂http://www.k ...

  8. Copy-On-Write技术 (摘录)

    Copy-On-Write技术     Copy-On-Write是写时才copy的意思,有延迟操作的意思在里面.比如往磁盘写数据,先写到的是内存里面,只有文件close或flush时才真正写到磁盘. ...

  9. 【转载】soapui基于持续集成工具自动化运行的调研姿势

    soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...

  10. hibernate简单应用

    Hibernate 第二章 核心API 和CURD实现 核心API介绍 单表操作方法 查询hql语句 1.认识hibernate 核心思想ORM:实现数据库中的文件一一映射为java中的实体类. 使用 ...