【原创】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. MFC之RTTI与动态创建

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...

  2. HNU 13375 Flowery Trails (spfa最短路)

    求最短路径覆盖的全部边权值和. 思路:分别从起点和终点两次求最短路,再比较两个点到起点的距离和他们之间的权值相加和是否等于最短路径. 这题很好 #include <cstring> #in ...

  3. HOG特征

    HOG(Histogram of gradient)统计图像局部区域的梯度方向信息来作为该局部图像区域的表征.HOG特征具有以下几个特点: (1)不具有旋转不变性(较大的方向变化),实际应用中不变性是 ...

  4. jqGrid 设置列宽

    在jqgrid显示出来之后,需要手动调整列宽. 1. 经过调查jqgrid本身不支持指定列宽,当然这个是说的的初始化完成后. 2. 经过调查手动是可以调整列宽,所以进行了事件的查看resizestop ...

  5. mac编程的debug工具

    Chisel是一个加强LLDB调试能力的小插件.主要特点在于辅助界面开发调试时在控制台以尽可能直观的方式查看界面的元素和情况.为我们梳理视图,控制器以及类关系层级.以及一些临时的界面调试变动进行快捷响 ...

  6. PHP魔术方法总结

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  7. 解决IE下iframe默认有白色背景的bug

    又是一个IE莫名其妙的bug:做了一个弹出层,层里面是一张透明图片,IE下的iframe默认会有一个白色的背景,所以当iframe的外围背景并不是白色的时候,这个iframe就会显得非常的“与众不同” ...

  8. 【转】html input radio取得被选中项的value

    html代码: <input id="rad" name="rad" type="radio" value="1" ...

  9. [USACO10MAR]伟大的奶牛聚集

    [USACO10MAR]伟大的奶牛聚集 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会. 每个奶牛居住在 N(1<=N& ...

  10. PAT 1033. To Fill or Not to Fill (25)

    题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1033 此题是一道贪心算法题,难度较大,关键在于贪心策略的选择: #include <cs ...