【原创】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. HW4.32

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  2. Codeforces295A - Greg and Array(线段树的成段更新)

    题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...

  3. Linux的read命令

    对于写bash脚本的朋友,read命令是不可或缺的,需要实践一下就可以了解read命令的大致用途: 编写一个脚本: #!/bin/bash # hao32 test read echo -e &quo ...

  4. [读书笔记]算法(Sedgewick著)·第一章(2)

    接着上一篇,mindmap更新如下内容. 3.背包.队列和栈 这节主要讲述了这三种数据结构(Bag.Queue.Stack)的API.实现以及链表.Queue和Stack还含有删除元素的方法.并引出了 ...

  5. Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)

    包括:    Eclipse的下载 Eclipse的安装 Eclipse的使用 本地模式或集群模式 Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群 ...

  6. hdu 3722 Card Game 二分图的最大权匹配

    题目可以转化为2个集合,x集合和y集合,其中的元素是1-n个字符串. 首先预处理点与点的边权,然后直接用二分图的最大权匹配模板. #include<stdio.h> #include< ...

  7. UVa 497 - Strategic Defense Initiative

    题目:最大上升子序列.输出一组解. 分析:dp,LIS.数据较小 O(n^2)算法就可以. 设以第i个数字作为最大上升子序列中的最后一个数的长度为 f(i),则有转移方程: f(i)= max(f(j ...

  8. mongdb使用场景

    你期望一个更高的写负载 默认情况下,对比事务安全,MongoDB更关注高的插入速度.如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例.但是必须避免在要求高事务安全的情景下使用Mo ...

  9. zoj 3672 思考题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4915 真是老了.脑子不会动了,可是事实上就算如今搜了题解A了,还是没总结出思 ...

  10. oracle数据库导入导出的dmp(转)

    window下: imp必须要dba用户,所以用sysdba用户登陆,然后给予chnlmgr用户dba权限 grant connect,resource,dba to chnlmgr; 全部导入 im ...