数据结构与算法 - 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 ...
随机推荐
- linux驱动程序之电源管理之Run-time PM 详解(4)
Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_su ...
- scp 详细总结
转自:http://www.ha97.com/4169.html scp命令跟cp命令类似,只不过cp命令是在同一台机器上用的,scp是在两台机器上复制传输数据的命令.scp实质相当于利用SSH协议来 ...
- codeforces629C Famil Door and Brackets (dp)
题意:给你一个长度为n的括号匹配串(不一定恰好匹配),让你在这个串的前面加p串和后面加上q串,使得这个括号串平衡(平衡的含义是对于任意位置的括号前缀和大于等于0,且最后的前缀和为0). 思路:枚举这个 ...
- HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻 ...
- easyui datagrid用formtater的问题
当value是一个字符串是直接使用value会提示value没有定义,这时需要转换下value,用""+value来替换就可以了.
- 团队项目·冰球模拟器——cmake 自动化构建系统的配置文件的编写
1 前言 考虑到命令行界面下编译程序并不如在 IDE 那么直观,再考虑到各位队友对 Linux 并不熟悉,如何大幅度地减轻整个项目的开发复杂度就是一个很重要的问题. 在 Linux 下有个很古老但很有 ...
- 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位
文件正在上传的转圈圈gif图片 一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...
- Windows Server 2012 R2中的网络诊断命令
Get-NetAdapter Get-NetIPAddress Get-NetIPConfiguration(GIP) TNC :Pinging Servers and Trace Route tnc ...
- CSS-div漂浮
显示效果如下: 代码如下: <div style="width:100%;border-top:0px solid #999999;"> <div style=& ...
- apache+php配置中遇到的问题
在安装apache+php配置中遇到的问题: LoadModule php5_module "D:/PHP/php5apache2_4.dll"PHPIniDir "D: ...