堆排序的OC实现
/*
建议先看堆调整方法,堆调整了解了,整个排序算法就算掌握了
*/
- (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实现的更多相关文章
- OC 实现的几个排序算法
和在VC++6.0里相比 在OC里面实现 不算困难 可是我用惯了C/C++呢 快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序 /******************** ...
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)
上篇博客主要讲了冒泡排序.插入排序.希尔排序以及选择排序.本篇博客就来讲一下堆排序(Heap Sort).看到堆排序这个名字我们就应该知道这种排序方式的特点,就是利用堆来讲我们的序列进行排序.&quo ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比
C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...
随机推荐
- bzoj 1879 [Sdoi2009]Bill的挑战(状压DP)
Description Input 本题包含多组数据. 第一行:一个整数T,表示数据的个数. 对于每组数据: 第一行:两个整数,N和K(含义如题目表述). 接下来N行:每行一个字符串. Output ...
- C语言结构
一个进程在内存中的布局如图所示: .text段(正文段)——保存程序所执行的程序二进制文件,CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令. . ...
- c语言 字符版 简易2048
花了两个多小时,用最蠢的方法写的……最简陋版…… 还不确定这么写逻辑对不对…… #include <iostream> #include <cstdio> #include & ...
- hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful【双连通分量求桥&&输出桥&&字符串处理】
By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others) ...
- (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing
/* * POJ_2287.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...
- IOS学习笔记38--@class #import辨析 #include
tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> #include 区分 #i ...
- Jquery常用方法篇(一)
1.add方法:将匹配的元素添加到当前的jquery对象集合中. 语法 add(expr,[context]) 参数1表示 用于匹配元素选择器(待添加的对象),或者用于动态生成的HTML代码(字符串) ...
- Delphi- 数据加密和解密
Delphi进行数据加密,在数据库方面经常要使用到.从网上转载过来的,以后会经常会用到. 一.MD5加密算法 在C#/.Net里提供了MD5加密的类库.在Delphi中没有.只能自己建一个新的单位,将 ...
- java统计程序运行的时间
耗时统计 第一种是以毫秒为单位计算的.long startTime = System.currentTimeMillis(); //获取开始时间 //程序做一些功能性的操作doSomething ...
- JIRA 6.0.1 (ZIP Archive)最新破解方法,绝对可用
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...