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

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

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

因为算法类,不止一个算法。所以新建一个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第二天(4)

    '.isdecimal()) print('壹'.isdecimal()) print('11d'.isdecimal()) #True #False #False #只有全部为unicode数字,全 ...

  2. windows+caffe(二)——图片转换为levedb格式

    借鉴于langb2014的  http://blog.csdn.net/langb2014/article/details/50458520 与liukailun09的  http://blog.cs ...

  3. Java虚拟机学习(4):对象内存分配与回收

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  4. pageX,clientX,screenX,offsetX的区别

    pageX/pageY: 鼠标相对于整个页面的X/Y坐标,但IE不支持.以body元素为参考点. clientX/clientY: 鼠标在浏览器内容区域的X/Y坐标,不包含滚动条,即需要滚动条的地方不 ...

  5. 基于ubuntu-2.6.35内核的SDIO-WiFi驱动移植

    一.移植环境:        1.主机:Ubuntu 10.10发行版        2.目标机:FS_S5PC100平台        3.交叉编译工具:arm-cortex_a8-linux-gn ...

  6. 20160622001 GridView 删除列 用模板实现删除时提示确认框

    GridView在使用CommandField删除时弹出提示框,在.net2005提供的GridView中我们可以直接添加一个 CommandField删除列:<asp:CommandField ...

  7. Android 图片的放大缩小拖拉

    package com.example.ImageView; import android.annotation.SuppressLint; import android.content.Contex ...

  8. json根据key取values

    function getJson(key, jsonObj) { for (var item in jsonObj) { if (item == key) { //item 表示Json串中的属性,如 ...

  9. php 面向对象中的魔术方法

    1.__construct() 实例化对象是被自动调用.当__construct和以类名为函数名的函数 同时存在时调用__construct,另一个不背调用. 类名为函数名的函数为老版的构造函数. 2 ...

  10. 深入浅出设计模式——策略模式(Strategy Pattern)

    模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务.在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可 ...