【原创】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 实现的更多相关文章

  1. java之数据结构与算法

    1.了解基本数据结构及特点 如,有哪些二叉树,各有什么特点 树二叉搜索树 每个节点都包含一个值,每个节点至多有两棵子树,左孩子小于自己,右孩子大于自己,时间复杂度是O(log(n)),随着不断插入节点 ...

  2. 开启基本数据结构和算法之路--初识Graphviz

    在我的Linux刀耕开荒阶段,就想开始重拾C,利用C实现常用的基本数据结构和算法,而数据结构和算法的掌握的熟练程度正是程序的初学者与职业程序员的分水岭. 那么怎么开启这一段历程呢? 按照软件工程的思想 ...

  3. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  5. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

  6. 数据结构与算法JavaScript (一) 栈

    序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录 ...

  7. 数据结构与算法 Big O 备忘录与现实

    不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新.        算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感 ...

  8. 《java数据结构和算法》读书笔记

    大学时并不是读计算机专业的, 之前并没有看过数据结构和算法,这是我第一次看.         从数据结构方面来说:                数组:最简单,遍历.查找很快:但是大小固定,不利于扩展 ...

  9. MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

随机推荐

  1. redis ltrim命令

    LTRIM key start stop 相关命令 BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX LRANGE LREM L ...

  2. Weka 自动优化参数

    import weka.core.*; import weka.classifiers.*; import weka.classifiers.meta.*; import weka.classifie ...

  3. 2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)

    http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可 ...

  4. 局域网接入Internet

    说在前面的话 局域网接入Internet的方式多样: 有1传统的Modem(调制解调器)拨号接入,费用低廉的2 ISDN和 3 ADSL接入,费用较高的4 DDN专线接入,5 Cable Modem高 ...

  5. storm的功能、三大应用

    storm的功能 Storm 有许多应用领域:实时分析.在线机器学习.持续计算.分布式 RPC(远过程调用协议,一种通过网络从远程计算机程序上请求服务). ETL(Extraction-Transfo ...

  6. linux tar 打包 压缩 解压

    dir:  tong 打包/压缩:tar zvf tong.rar tong        tar -czf tong.tar.gz tong 解压缩:tar xvf tong.rar 查看压缩包里的 ...

  7. jsp <c:forEach> 判断第一条 或 最后一条记录

    <c:forEach>标签具有以下一些属性: var:迭代参数的名称.在迭代体中可以使用的变量的名称,用来表示每一个迭代变量.类型为String. items:要进行迭代的集合.对于它所支 ...

  8. Cocos2d-x MultipleTouch & CCControllButton's confusion

    在cocos2dx的程序设计中有时候会遇到需要多点触摸的功能,下面先介绍一下在cocos2dx中多点触摸的一般规则,然后介绍我遇到的一个有关多点触摸的情景的解决方案. (一)使用多点触摸规则: 关于多 ...

  9. iOS Xcode8的适配

    1.打开应用后打印了很多的log信息 解决方法: Xcode8里边 Edit Scheme... -> Run -> Arguments, 在Environment Variables里边 ...

  10. 使用freemarker生成html

    http://herryhaixiao.iteye.com/blog/677524 由于freemarker这个技术很久很久就有了,注释我就没写得很详细了,相信大家都看得懂.下面就直接上代码以及一些代 ...