数据结构与算法 - 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 = 0; i < self.count - 1; i++){ for(int j = 0; j < self.count - 1 - i; j++){ if (cmpBlock([self objectAtIndex:j], [self objectAtIndex:j+1])) { temp = [self objectAtIndex:j]; [self replaceObjectAtIndex:j withObject:[self objectAtIndex:j+1]]; [self replaceObjectAtIndex:j+1 withObject:temp]; } } } temp = nil; } - (void) sortByChoose:(compareElement) cmpBlock{ NSObject *temp = nil; NSInteger maxIndex = 0; for (int i = 0; i < self.count - 1; i++) { maxIndex = 0; for (int j = 0; j < self.count - 1 - i; j++) { if (cmpBlock([self objectAtIndex:maxIndex], [self objectAtIndex:j])) { maxIndex = j; } } temp = [self objectAtIndex:self.count - 1 - i]; [self replaceObjectAtIndex:self.count - 1 - 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 = 1; i < self.count; i++) { temp = [self objectAtIndex:i]; int j = 0; for (j = i; j > 0 && cmpBlock(temp, [self objectAtIndex:j-1]) ; j--) { [self replaceObjectAtIndex:j withObject:[self objectAtIndex:j-1]]; } [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 = 0; 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:@45, @2, @63,@11, nil]; self.testBubbleAfter = [NSMutableArray arrayWithObjects:@2, @11, @45,@63, nil]; self.testChooseBefore = [NSMutableArray arrayWithObjects:@45, @2, @63,@11, nil]; self.testChooseAfter = [NSMutableArray arrayWithObjects:@2, @11, @45,@63, nil]; self.testInsertB = [NSMutableArray arrayWithObjects:@45, @2, @63,@11, nil]; self.testInsertA = [NSMutableArray arrayWithObjects:@2, @11, @45,@63, 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现