数据结构与算法 - OC 实现
【原创】http://www.cnblogs.com/luoguoqiang1985/
冒泡排序:通过N-1次对剩余未排序元素中最大(小)元素的上浮来实现排序,上浮过程通过交换相邻元素实现。
选择排序:通过N-1次将剩余未排序元素中最大(小)元素放置到数组尾部来实现排序。
插入排序:插入排序使用的是增量(incremental)方法;在排好子数组A[1..j-1]后,将A[j]插入,形成排好序的子数组A[1..j];
OC例子:
NSMutableArray+SortTools.h
//比较算法的块定义
//若需要置换返回YES,否则返回NO
typedef BOOL (^compareElement)(NSObject * el1, NSObject *el2); @interface NSMutableArray (SortTools)
/*
* 通过N-1次对剩余未排序元素中最大或最小元素的上浮来实现排序。
* 上浮通过交换相邻元素实现
*/
- (void) sortByBubble:(compareElement) cmpBlock;
/*
*通过N-1次将剩余未排序元素中最大(小)元素放置到数组尾部来实现排序。
*/
- (void) sortByChoose:(compareElement) cmpBlock;
/*
*插入排序使用的是增量(incremental)方法;在排好子数组A[1..j-1]后,将A[j]插入,形成排好序的子数组A[1..j];
*/
- (void) sortByInsert:(compareElement) cmpBlock;
/*
* 内容是否一样
*/
- (BOOL) isTheSame:(NSArray *)otherArray
usingCompareBlock:(compareElement) cmpBlock; @end
NSMutableArray+SortTools.m
@implementation NSMutableArray (SortTools)
/*
*通过N-1次对剩余未排序元素中最大或最小元素的上浮来实现排序。
*上浮通过交换相邻元素实现
*/
- (void) sortByBubble:(compareElement) cmpBlock
{
NSObject *temp = nil;
for(int i = ; i < self.count - ; i++){
for(int j = ; j < self.count - - i; j++){
if (cmpBlock([self objectAtIndex:j], [self objectAtIndex:j+])) {
temp = [self objectAtIndex:j];
[self replaceObjectAtIndex:j
withObject:[self objectAtIndex:j+]];
[self replaceObjectAtIndex:j+ withObject:temp];
}
}
}
temp = nil;
} - (void) sortByChoose:(compareElement) cmpBlock{
NSObject *temp = nil;
NSInteger maxIndex = ;
for (int i = ; i < self.count - ; i++) {
maxIndex = ;
for (int j = ; j < self.count - - i; j++) {
if (cmpBlock([self objectAtIndex:maxIndex], [self objectAtIndex:j])) {
maxIndex = j;
}
}
temp = [self objectAtIndex:self.count - - i];
[self replaceObjectAtIndex:self.count - - i
withObject:[self objectAtIndex:maxIndex]];
[self replaceObjectAtIndex:maxIndex withObject:temp];
}
temp = nil;
}
/*
*插入排序使用的是增量(incremental)方法;在排好子数组A[1..j-1]后,将A[j]插入,形成排好序的子数组A[1..j];
*/
- (void) sortByInsert:(compareElement) cmpBlock{
NSObject *temp = nil;
for (int i = ; i < self.count; i++) {
temp = [self objectAtIndex:i];
int j = ;
for (j = i; j > && cmpBlock(temp, [self objectAtIndex:j-]) ; j--) {
[self replaceObjectAtIndex:j withObject:[self objectAtIndex:j-]];
}
[self replaceObjectAtIndex:j withObject:temp];
}
} /*
* 内容是否一样
*/
- (BOOL) isTheSame:(NSArray *)otherArray
usingCompareBlock:(compareElement) cmpBlock{ BOOL isSame = YES; if (self.count != otherArray.count) {
isSame = NO;
} else {
for (int i = ; i < self.count; i++) {
if ([self objectAtIndex:i] == nil) {
continue;
} if (!cmpBlock([self objectAtIndex:i], [otherArray objectAtIndex:i])) {
isSame = NO;
break;
}
}
} return isSame;
} @end
单元测试案例:
@synthesize testBubbleBefore, testBubbleAfter, testChooseAfter, testChooseBefore; - (void)setUp
{
[super setUp]; // Set-up code here.
self.testBubbleBefore = [NSMutableArray arrayWithObjects:@, @, @,@, nil]; self.testBubbleAfter = [NSMutableArray arrayWithObjects:@, @, @,@, nil]; self.testChooseBefore = [NSMutableArray arrayWithObjects:@, @, @,@, nil]; self.testChooseAfter = [NSMutableArray arrayWithObjects:@, @, @,@, nil]; self.testInsertB = [NSMutableArray arrayWithObjects:@, @, @,@, nil]; self.testInsertA = [NSMutableArray arrayWithObjects:@, @, @,@, nil];
} - (void)tearDown
{
// Tear-down code here. [self.testBubbleBefore removeAllObjects];
[self.testBubbleAfter removeAllObjects];
[self.testChooseBefore removeAllObjects];
[self.testChooseAfter removeAllObjects];
[self.testInsertB removeAllObjects];
[self.testInsertA removeAllObjects]; [super tearDown];
} /*
*冒泡测试
*/
- (void)testBubble
{ [self.testBubbleBefore sortByBubble:^BOOL(NSObject *el1, NSObject *el2) {
__weak NSNumber *n1 = (NSNumber *)el1;
__weak NSNumber *n2 = (NSNumber *)el2;
return n1.intValue > n2.intValue;
}]; BOOL isSame = [self.testBubbleBefore isTheSame:self.testBubbleAfter usingCompareBlock:^BOOL(NSObject *el1, NSObject *el2) {
__weak NSNumber *n1 = (NSNumber *)el1;
__weak NSNumber *n2 = (NSNumber *)el2;
return n1.intValue == n2.intValue;
}];
STAssertTrue(isSame, @"testBefore is not the same as testAfter!"); } /*
*选择排序测试
*/
- (void)testChoose
{ [self.testChooseBefore sortByChoose:^BOOL(NSObject *el2, NSObject *el1) {
__weak NSNumber *n2 = (NSNumber *)el2;
__weak NSNumber *n1 = (NSNumber *)el1;
return n1.intValue > n2.intValue;
}]; BOOL isSame = [self.testChooseBefore isTheSame:self.testChooseAfter usingCompareBlock:^BOOL(NSObject *el1, NSObject *el2) {
__weak NSNumber *n1 = (NSNumber *)el1;
__weak NSNumber *n2 = (NSNumber *)el2;
return n1.intValue == n2.intValue;
}];
STAssertTrue(isSame, @"testBefore is not the same as testAfter!"); } /*
*插入排序测试
*/
- (void)testInsert
{ [self.testInsertB sortByInsert:^BOOL(NSObject *el2, NSObject *el1) {
__weak NSNumber *n1 = (NSNumber *)el1;
__weak NSNumber *n2 = (NSNumber *)el2;
return n1.intValue > n2.intValue;
}]; BOOL isSame = [self.testInsertB isTheSame:self.testInsertA usingCompareBlock:^BOOL(NSObject *el1, NSObject *el2) {
__weak NSNumber *n1 = (NSNumber *)el1;
__weak NSNumber *n2 = (NSNumber *)el2;
return n1.intValue == n2.intValue;
}];
STAssertTrue(isSame, @"testBefore is not the same as testAfter!"); } @end
数据结构与算法 - OC 实现的更多相关文章
- java之数据结构与算法
1.了解基本数据结构及特点 如,有哪些二叉树,各有什么特点 树二叉搜索树 每个节点都包含一个值,每个节点至多有两棵子树,左孩子小于自己,右孩子大于自己,时间复杂度是O(log(n)),随着不断插入节点 ...
- 开启基本数据结构和算法之路--初识Graphviz
在我的Linux刀耕开荒阶段,就想开始重拾C,利用C实现常用的基本数据结构和算法,而数据结构和算法的掌握的熟练程度正是程序的初学者与职业程序员的分水岭. 那么怎么开启这一段历程呢? 按照软件工程的思想 ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引背后的数据结构及算法原理【转】
本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...
- 数据结构与算法JavaScript (一) 栈
序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...
- 数据结构与算法 Big O 备忘录与现实
不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新. 算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...
- 《java数据结构和算法》读书笔记
大学时并不是读计算机专业的, 之前并没有看过数据结构和算法,这是我第一次看. 从数据结构方面来说: 数组:最简单,遍历.查找很快:但是大小固定,不利于扩展 ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- 类加载器classCloader
ref: http://blog.csdn.net/studyvcmfc/article/details/7720322 得复习一下深入java虚拟机 1.类加载器干啥的? 把 class文件加载到虚 ...
- 五指CMS开发日志(一)
开发了这么长时间,基本功能已经具备了.分享一下后台的界面吧.
- Windows Azure公有云服务相关方案
http://www.cnblogs.com/sennly/p/4139675.html 1.公有云平台服务简介 Windows Azure 是一个灵活而开放的云平台,通过该平台,您可以在数据中心快速 ...
- ERROR hdfs.DFSClient: Failed to close file解决方法
14/04/11 17:59:44 ERROR hdfs.DFSClient: Failed to close file /wlan_out/_temporary/_attempt_local_000 ...
- ubuntu glusterfs 配置调试
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqMAAADpCAIAAACfoakcAAAgAElEQVR4nO2d2XMjSX7f8c+sQ4GwHY
- CodeForces 352D. Jeff and Furik
题意:给n个数,第一个人选取相邻两个递降的数交换顺序,第二个人一半的概率选取相邻两个递降的数交换顺序,一半的概率选取相邻两个递增的数交换顺序.两个人轮流操作,求整个数列变成递增数列所需交换次数的期望. ...
- 程序员需要掌握哪些IT技能
据Foote Partners的最新调查:如今,你掌握的 IT 技能的多少决定了你薪资的多少,但你不一定非要比开源架构师或Certified Secure Software Life Cycle Pr ...
- mmsql 查询每个分类的前3条数据
select * from (select *,row_number() over(partition by PropertyRoofBeamID order by PropertyRoomID de ...
- Moq4在.NET3.5和.NET4版本之间的差异
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Moq4在.NET3.5和.NET4版本之间的差异.
- asp.net中为什么修改了配置文件后我们不需要重启IIS
本文转载:http://blog.itpub.net/12639172/viewspace-659819/ 大家知道,asp.net中,如果我们修改了配置文件只要把它保存之后,就会立刻反应到程序中, ...