话不多说,学了这么多,写个快速排序先。

除了快排,以后有时间还要加堆排、归并等等。

今天学了有,类、协议、语法。

因为算法类,不止一个算法。所以新建一个Algorithm(算法)协议:

 #import <Foundation/Foundation.h>

 @protocol AlgorithmProtocol <NSObject>

 @optional
+(void)quickSortWithArray:(NSMutableArray*)array FirstIndex:(long)first EndIndex:(long)end CompareMethod:(bool(^)(id,id)) compare; @end

接下来,新建一个Algorithm(算法)类,遵循算法协议:

 #import <Foundation/Foundation.h>
#import "AlgorithmProtocol.h" @interface Algorithm : NSObject <AlgorithmProtocol> @end @implementation Algorithm +(void)quickSortWithArray:(NSMutableArray*)array FirstIndex:(long)firstIndex EndIndex:(long)endIndex CompareMethod:(bool(^)(id,id)) compare{
long (^partition)(NSMutableArray*,long,long) = ^(NSMutableArray *innerArray,long first,long end){
long i = first;
long j = end;
while (i<j) {
while (i<j && !compare(innerArray[i],innerArray[j])) {
j--;
}
if (i<j) {
id tmp = innerArray[i];
innerArray[i] = innerArray[j];
innerArray[j] = tmp;
i++;
}
while (i<j && !compare(innerArray[i],innerArray[j])) {
i++;
}
if (i<j) {
id tmp = innerArray[i];
innerArray[i] = innerArray[j];
innerArray[j] = tmp;
j--;
}
}
return i;
};
if (firstIndex<endIndex) {
long pivot = ;
pivot = partition(array,firstIndex,endIndex);
[self quickSortWithArray:array FirstIndex:firstIndex EndIndex:pivot- CompareMethod:compare];
[self quickSortWithArray:array FirstIndex:pivot+ EndIndex:endIndex CompareMethod:compare];
}
} @end

然后就是使用,main文件:

#import <Foundation/Foundation.h>
#import "Algorithm.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
//测试数组
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:@];
[array addObject:@];
[array addObject:@];
[array addObject:@];
[array addObject:@];
NSMutableArray *arrayCopy = [array copy]; [Algorithm quickSortWithArray:array FirstIndex: EndIndex:[array count] - CompareMethod:^bool(id obj1, id obj2) {
if (obj1>obj2){
return true;
}else{
return false;
}
}]; NSLog(@"\n排序前:%@\n排序后:%@",arrayCopy,array);
}
return ;
}

验证一下结果:

Objective-C学习笔记-第一天(3)的更多相关文章

  1. ActionBarSherlock学习笔记 第一篇——部署

    ActionBarSherlock学习笔记 第一篇--部署          ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...

  2. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  3. Django学习笔记---第一天

    Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...

  4. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  5. GIT学习笔记——第一章

    git之vim编辑器退出命令 # 学习笔记 张文军微博主页  张文军码云主页   张文军新浪云主页  张文军博客主页 ## 刚学习git,好多东西没接触过,进入vim后不知道如何出来了,网上找了很多都 ...

  6. 《JavaScript权威指南》学习笔记 第一天。

    这是零零散散的笔记,作为自己看书打demo的笔记.不足为各位学习,留作自己复习知识点备用. 1.检测对象中某个属性存在不存在: <script> // in 运算符 //不管是对象的自有属 ...

  7. PRML学习笔记第一章

    [转] PRML笔记 - 1.1介绍 模式识别的目标 自动从数据中发现潜在规律,以利用这些规律做后续操作,如数据分类等. 模型选择和参数调节 类似的一族规律通常可以以一种模型的形式为表达,选择合适模型 ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. AndroidStudio学习笔记-第一个安卓程序

    要带一个本科生做一部分跟安卓有点关系的项目,于是趁着机会学习一下编写安卓程序. 第一篇材料来自谷歌官方,传送门:https://developer.android.com/training/basic ...

  10. 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C

    blog.csdn.net/totogo2010/article/details/8205810  目录(?)[-] 第一课名称 MVC and Introduction to Objective-C ...

随机推荐

  1. 初识python第一天

    一.python简介 1.1 python的诞生 python的创始人吉多.范罗苏姆(Guido van Rossum),他在开发python语言之前曾使用过几年的ABC语言,ABC是一门主要用于教学 ...

  2. 打包app命令行

    $ cd myApp $ ionic platform add android $ ionic build android $ ionic emulate android

  3. 2016年12月20日 星期二 --出埃及记 Exodus 21:15

    2016年12月20日 星期二 --出埃及记 Exodus 21:15 "Anyone who attacks his father or his mother must be put to ...

  4. RCP: P2 Update两个烦人bug和解决办法

    问题 Eclipse新的P2 Update机制,使用起来很方便,如果使用P2 plugin自带的UI,开发者完全不用写任何代码 即可实现application的在线更新. 但是P2 Update至少有 ...

  5. html、css 【珍藏】

       行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效.     块级元素: 各占据一 ...

  6. shell中 "" 跟 ''的区别

    在bash里,这两个都是引号,用来表明字符串,区别是,双引号中的变量会被展开,而单引号中不再展开.举个例子:a="abc"echo "str=$a" # 结果显 ...

  7. createjs mask 填坑过程

    createjs 的mask必须使用 shape  (不算坑) 作为遮罩的shape不能被 addChild  (上一次 自己居然躲过了,这次被巨坑) var S=this; var shape = ...

  8. jquery mobile 和phonegap开发总结之三跨域加载页面

    跨域加载 一要进行一定的配置见下面 $( document ).bind( "mobileinit", function() { // Make your jQuery Mobil ...

  9. Trick

    1. var b = a.slice(beginIndex,endIndex); [].slice.call( [] ) Array.prototype.slice.call([]) will cop ...

  10. RMAN的入门篇

    一.RMAN连接数据库 1.  连接本地数据库 [oracle@oracle hotbak]$ export oracle_sid=orcl [oracle@oracle hotbak]$ rman ...