obj-c 数组排序

【华为OD机试】数组去重和排序(python, java, c++, js) 给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同的次数按照第一次出现的顺序进行先后排序。 阅读详情
http://blog.ablepear.com/2011/11/objective-c-tuesdays-sorting-arrays.html  

使用qsort()为C数组排序  

C标准库包含一个内置的为数组排序的方法:qsort(),这是快速排序算法的一个实现。其排序之后的结果仍然放在原数组中 

qsort() 的函数声明是这样: 
C代码   收藏代码
  1. qsort(void *array, size_t itemCount, size_t itemSize,  
  2.      int (*comparator)(void const *, void const *));  

如果你没有在C中使用过函数指针,qsort()的函数声明看上去会有点让人迷惑。这是因为声明一个C函数指针类型有点唬人。我会用typedef让它看上去容易理解一些: 
C代码   收藏代码
  1. // alternate declaration of qsort using a typedef:  
  2. typedef int (*Comparator)(void const *, void const *);  
  3.   
  4. qsort(void *array, size_t itemCount, size_t itemSize,  
  5.      Comparator comparator);  

函数指针和函数的声明在C中是大体相同的,唯一的区别是函数指针在函数名前有一个*,像其他变量类型的指针一样。但有一个问题。在一个函数指针的声明里,*会引起歧义;默认情况下,C会认为*是函数返回省的一部分.因些当你声明一个函数指针的时候,需要为*和函数名加括号.这样便于编译器识别. 
C代码   收藏代码
  1. // 声明一个函数,返回int类型的指针  
  2. int *returnAPointerToSomeInt(void);  
  3. // 与下面这个声明相同:  
  4. // (int *)returnAPointerToSomeInt(void);  
  5.   
  6. // 声明一个函数指针,这个函数返回类型是int  
  7. int (*returnSomeInt)(void);  

既然我们已经说清楚了函数指针,让我们再来看看qsort()的函数声明 
C代码   收藏代码
  1. typedef int (*Comparator)(void const *, void const *);  
  2.   
  3. qsort(void *array, size_t itemCount, size_t itemSize,  
  4.      Comparator comparator);  

qsort()的前三个参数指定了要排序的数组,数组中元素的数量和单元元素的大小(字节数) 
注意数组的类型是 void *,这就允许我们可以为任意类型的数组排序. 

最后一个参数是比较函数. 
C代码   收藏代码
  1. typedef int (*Comparator)(void const *item1, void const *item2);  

比较函数使用两个指向数组中元素的指针,如果item1在item2前,返回一个负值,如果item1在item2后,返回一个正值,如果两个元素有相同的排序值,返回0.这种风格的比较函数被用在许多语言的排序中. 理解比较函数可以看下面的图: 


  item1 <=====<< item2 
<-+------+-----+------+------+-> 
-2     -1     0      1      2 

          item2 >>=====> item1 
<-+------+-----+------+------+-> 
-2     -1     0      1      2 

C标准库没有太多的比较函数,但比较函数很容易编写。这里是个比较int类型数据的例子: 
C代码   收藏代码
  1. int compareInts(void const *item1, void const *item2) {  
  2.  int const *int1 = item1;  
  3.  int const *int2 = item2;  
  4.  return *int1 - *int2;  
  5. }  

现在我们可以使用compareInts()来排序一个int型的数组了: 
C代码   收藏代码
  1. int array[6] = { 42, 17, 57, 19, 11, 5 };  
  2.   
  3. qsort(array, 6, sizeof(int), compareInts);  
  4. // array now contains 5, 11, 17, 19, 42, 57  

qsort()非常灵活.对复杂类型的数组进行排序和对int类型的数组一样简单.为一个C string数组按词典排序,可以使用标准库中的strcmp()作为比较函数. 
C代码   收藏代码
  1. char const *array[3] = { "red", "green", "blue" };  
  2.   
  3. qsort(array, 3, sizeof(char const *), strcmp);  
  4. // array now contains "blue", "green", "red"  


为一个CGPoints的数组排序,先写一个比较函数: 
C代码   收藏代码
  1. int compareCGPoints(void const *item1, void const *item2) {  
  2.  struct CGPoint const *point1 = item1;  
  3.  struct CGPoint const *point2 = item2;  
  4.   
  5.  if (point1->x < point2->x) {  
  6.    return -1;  
  7.  } else if (point1->x > point2->x) {  
  8.    return 1;  
  9.  }  
  10.   
  11.  if (point1->y < point2->y) {  
  12.    return -1;  
  13.  } else if (point1->y > point2->y) {  
  14.    return 1;  
  15.  }  
  16.   
  17.  return 0;  
  18. }  

注意我们先比较点的X坐标,只在X坐标相等的情况下才比较Y坐标.这是比较struct中多个字段的通用方式。这是一个CGPoint比较的例子: 
C代码   收藏代码
  1. struct CGPoint pointArray[4] = {  
  2.  { 4.0f, 3.0f },  
  3.  { 2.0f, 1.0f },  
  4.  { 4.0f, 1.0f },  
  5.  { 2.0f, 3.0f }  
  6. };  
  7. qsort(pointArray, 4, sizeof(struct CGPoint), compareCGPoints);  
  8. // pointArray now contains:  
  9. //  { 2.0f, 1.0f }  
  10. //  { 2.0f, 3.0f }  
  11. //  { 4.0f, 1.0f }  
  12. //  { 4.0f, 3.0f }  


其他C排序函数  
对于大多数的普通排序工作,qsort()是个不错的选择,并且是C标准库是的内置的唯一选择。OS X和iOS也包含其他一些值得一提的排序函数:heapsort()和mergesort(),它们和qsort使用同样的参数.heapsort() 比qsort() 慢,但是排序过程中使用有限的内存, qsort() 使用递归并且可能导致堆栈溢出. 当数组已经大分部已经有序的情况下mergesort()比qsort()快很多,但是在数组很随机的情况下会慢很多. 

NSArray排序  

Objective-C 提供许多 NSArray排序的方法.因为NSArray 对象是不可修改的,所以用于排序 NSArray 的方法都返回一个新的排序好的 NSArray 对象,原始的NSArray不变. 最基本的排序方法是-sortedArrayUsingFunction:context:, 它和使用qsort()排序 C 相似. 函数声明是这样: 
C代码   收藏代码
  1. - (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator   
  2.                               context:(void *)context  

第一个参数是比较函数的指针, 
像我们为 qsort()做的那样, 我将要使用typedef重写函数指针方法声明,以便于阅读: 
C代码   收藏代码
  1. typedef NSInteger (*Comparator)(id item1, id item2, void *context);  
  2.   
  3. - (NSArray *)sortedArrayUsingFunction:(Comparator)comparator   
  4.                               context:(void *)context  

NSArray排序用的比较函数和qsort的比较函数稍有不同.它的返回值是NSInteger类型的,其实NSInteger只是int的一个typedef.它使用两个id类型的元素,而不是void const *,因为 NSArrays 只能容纳 object 类型.并且最后,还有一个额外的 context 参数, 一个 void 指针,这个指针允许你传递额外的信息给比较函数. 

让我们写一个按NSString长度排序的比较函数. 
C代码   收藏代码
  1. static NSInteger compareStringsByLength(id item1, id item2, void *context) {  
  2.   return [item1 length] - [item2 length];  
  3. }  

因为我们可以传递任务消息给一个id类型的变量,所以我们甚至不需要类型转换或中间变量. 

下面看看我们怎么使用它: 
C代码   收藏代码
  1. NSArray *array = [NSArray arrayWithObjects:@"Florida",   
  2.                     @"Texas", @"Mississippi", @"Delaware", nil];  
  3.   
  4. NSArray *sortedArray = [array sortedArrayUsingFunction:compareStringsByLength   
  5.                                                context:NULL];  
  6. // sortedArray contains:  
  7. // @"Texas"  
  8. // @"Florida"  
  9. // @"Delaware"  
  10. // @"Mississippi"  

现在让我们使用context参数来方便地在普通和逆序排序之间切换.我们能传递参数给任务类型的数据,所以我们使用一个BOOL类型的指针,YES代表逆序,NO代表普通排序. 
C代码   收藏代码
  1. NSInteger compareStringsByLength(id item1, id item2, void *context) {  
  2.   BOOL *reversed = context;  
  3.   NSInteger order = [item1 length] - [item2 length];  
  4.   if (*reversed) {  
  5.     return -order;  
  6.   } else {  
  7.     return order;  
  8.   }  
  9. }  

现在我们需要传递值给context参数当我们调用-sortedArrayUsingFunction:context:的时候: 
C代码   收藏代码
  1. NSArray *array = [NSArray arrayWithObjects:@"Florida",   
  2.                     @"Texas", @"Mississippi", @"Delaware", nil];  
  3.   
  4. BOOL reversed = YES;  
  5. NSArray *sortedArray = [array sortedArrayUsingFunction:compareStringsByLength   
  6.                                                context:&reversed];  
  7. // sortedArray contains:  
  8. // @"Mississippi"  
  9. // @"Delaware"  
  10. // @"Florida"  
  11. // @"Texas"  

注意我们用&操作符来传递变量reversed的地址作为context. 

如果你的目标系统是iOS3.2, OS X 10.6以上,你可以用block版,-sortedArrayUsingComparator:. 我们可以这样重写我们的例子: 
C代码   收藏代码
  1. NSArray *array = [NSArray arrayWithObjects:@"Florida",   
  2.                     @"Texas", @"Mississippi", @"Delaware", nil];  
  3.   
  4. BOOL reversed = YES;  
  5. NSArray *sortedArray = [array sortedArrayUsingComparator:^(id item1, id item2) {  
  6.   NSInteger order = [item1 length] - [item2 length];  
  7.   if (reversed) {  
  8.     return -order;  
  9.   } else {  
  10.     return order;  
  11.   }  
  12. }];  
  13. // sortedArray contains:  
  14. // @"Mississippi"  
  15. // @"Delaware"  
  16. // @"Florida"  
  17. // @"Texas"  


因为所有在NSArray中的元素必需是对象,经常的情况是这些元素自身带有比较方法.如果是这样的话,-sortedArrayUsingSelector: 方法非常好。NSString类型的NSArray非常常见. 
C代码   收藏代码
  1. NSArray *tagNames = [NSArray arrayWithObjects:@"H1",   
  2.                     @"body", @"A", @"Head", nil];  
  3.   
  4. NSArray *sortedTagNames = [tagNames sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];  
  5. // sortedTagNames contains:  
  6. // @"A"  
  7. // @"body"  
  8. // @"H1"  
  9. // @"Head"  
[C/C++]_[Object-C]_[数组排序比较] 场景 在macOS下Objective-C的数组是如何排序的? C++的数组std::vector如何排序呢? C++和Objective-C的数组排序有什么不同呢? 说明 Objective-C的数组排序是以方法的形式来提供的,可以说很方便。而C++是以算法库来提供的, 不方便, 只能说优点就是效率高和内存利用率高. 因为C++的数组排序不会创建新数组. 例子 // // ma... 阅读详情

相关推荐

让 AI 变聪明的 20 条指令:如何让大模型回答得更精准、更专业、更实事求是

让 AI 变聪明,本质上不是写几句神奇咒语,而是把你的任务表达得更清楚,把事实标准设得更严格,把输出格式规定得更明确,把不确定性管理得更认真,把历史对话利用得更充分。大模型的强项是语言生成、信息组织、模式归纳和方案扩展;弱项是事实核验、实时更新、责任判断和对模糊意图的准确猜测。好的指令,就是在用人的判断弥补模型的弱点,让模型把强项发挥在正确的地方。

Sumarua的博客 1480

给object数组进行排序(排序条件是每个元素对象的属性个数)

console.log(objArrSort([{attr1: 1, attr2: 2}, {}, {attr1: 1}])) function objArrSort(waitArr) { var objLengthArr = []; for (var i = 0, len = waitArr.length; i &amp;lt; len; i++) { objLengthArr.pus...

下雨不愁的博客 1699

RP Fiber Power 版本

RP Fiber Power的版本历史 该软件一直受到多年来广泛的发展计划,这大大扩展了其功能,以及用户界面的质量。 V1 这是第1个版本。 它仅限于光纤激光器和放大器的连续波计算,并且只能通过脚本进行控制。 V2 版本2引入了交互式表单。 至少对于更简单的模拟,现在可以简单地通过填写表单来工作,而V1必须通过脚本来控制。 例如,屏幕截图显示了输入某些信号参数的表单: 当您基于这些表单执行计算时,程序将根据您的表单输入自动编写脚本文件,然后执行该脚本。如果您需要编写脚本以获得更大的灵活性,可以稍后查看该脚

Asdmath的博客 2431

数组排序

[url]http://blog.ablepear.com/2011/11/objective-c-tuesdays-sorting-arrays.html[/url] [b]使用qsort()为C数组排序[/b] C标准库包含一个内置的为数组排序的方法:qsort(),这是快速排序算法的一个实现。其排序之后的结果仍然放在原数组中 qsort() 的函数声明是这样: [code...

ever8182的专栏 183

Postman调试海康ISAPI接口全记录:从鉴权失败到成功修改设备名的踩坑指南

本文详细记录了使用Postman调试海康ISAPI接口的全过程,从鉴权失败到成功修改设备名的实战经验。涵盖Digest认证机制、XML请求体构造、常见错误排查及代码实现过渡,帮助开发者高效解决海康设备集成中的各种问题。

weixin_42620913的博客 660

从0死磕全栈之使用 VS Code 调试 Next.js 应用完整指南

调试目标推荐方式客户端组件VS Code + Chrome 调试器(pwa-chrome中间件(Middleware)同服务端方式静态生成(SSG)逻辑需在next build时调试,建议改用dynamic路由临时测试通过合理配置 VS Code 调试器,你可以像调试普通 Node.js 或前端项目一样,高效排查 Next.js 应用中的各类问题。🐞。

weixin_44058951的博客 1159

【C语言】详解C语言常用的五种数组排序方式

给大家分享一下数组的各种常用的五种排序算法:选择排序、冒泡排序、交换排序、插入排序、折半排序。图文代码结合超简单一看就懂,建议收藏!

weixin_50111954的博客 2万+

ABAP代码使用OAuth2.0 Client Credential调用外部API

ABAP-OAuth2.0-调用外部API

m0_74015269的博客 1956

c语言数组排序常用算法,七种常见的数组排序算法整理(C语言版本)

~~~C语言版本~~~冒泡排序选择排序直接插入排序二分插入排序希尔排序快速排序堆排序#define EXCHANGE(num1, num2) { num1 = num1 ^ num2;\num2 = num1 ^ num2;\num1 = num1 ^ num2;}排序算法是否稳定:相同元素的相对在排序前后是否会发生改变,如果会,就是不稳定的,否则就是稳定的。一.冒泡排序冒泡排序原理很容易理解,...

weixin_32631179的博客 5020

vue3 - vite报错TypeError: crypto.hash is not a function(vue3+vite启动运行提示错误,项目无法启动且打包报错失败,详细解决排查方案教程)

vue3 vite 报错,vue3+vite启动报错:TypeError: crypto.hash is not a function,创建vue3+vite项目时报错TypeError: crypto.hash is not a function,如何解决这个问题,VUE3+VITE报错crypto.hash,vue3运行报错,vite运行报错,vue3打包报错,vite打包报错,vue3新建项目无法运行,vue3 vite创建项目直接报错了,node版本不兼容,修改了node版本还是不行,依旧报错,一直

✅ 精选推荐文章 1万+

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 111

JQuery(四) 对象数组进行排序

一.升序 //对数组进行排序 function compare(property) { return (firstobj, secondobj) => { const firstValue = firstobj[property]; const secondValue = secondobj[property]; r...

风之子 9524

Openlayers 教程 02 - 地图添加 WKT WKB GeoJson 格式的点线面数据

WebGIS 开发中,对于数据量不是很大的场景,可以直接从数据库读取数据,通过创建点线面要素(Feature),然后添加到矢量图层(vectorLayer)中,在地图上展示。添加点线面的方法可以封装一下,方便使用。...

非科班Java出身GISer的博客 3854

Obj-c数组排序

sortedArrayUsingComparator数组排序方法 sortedArrayUsingSelector方法只能升序 array = [array sortedArrayUsingSelector:@selector(compare:)];12// 给数组排序,块代码的返回值,比较结果 // NSOrderedAscending = -1, 上升 // NSOrderedSame

红颜的博客 567

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数组中是字典的排序问题

obj-c真的是一个神奇的语言。当一个数组中包含zid

sunshine5230的专栏 646

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

NSDictionary排序

按NSDictionary的key来对其进行排序: 先将dict的allkeys赋给一个数组,然后通过sortedArrayUsingComparator:方法对数组排序,然后遍历数组取字典对应key的值就ok int i = 0;          NSArray *keys = [dict allKeys];     NSArray *sortedAr

editkiller的专栏 4216

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NSArray 排序

sortedArray :已排序数组   array :待排序数组 NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {  if ([obj1 integerValue] > [obj2 integerValue]) {  return (NSComparisonResult)NSOrder

谁的青春不奋斗 462

#Objective-C 经典字典数组排序 - 省市区

1.首先要准备好包含所有省市区的文档,将文档拖到我们建好的Xcode里 2.然后新建一个路径NSString *path = @" ";   再将省市区文档拖到@"  "中; 3.在进行排序前,我们首先要先滤清思路:这答题的难题是在于如何将字典装入数组,再把数组装入字典,所以关键点就在于如何通过嵌套将每个字典与数组归到于它们相对应的数组与字典里   提供一个

烽火连城的博客 438

object-c中数组的排序

// // main.m // NSArray的排序 // // Created by ganchaobo on 13-4-28. // Copyright (c) 2013年 ganchaobo. All rights reserved. // #import &lt;Foundation/Foundation.h&gt; #import "Student.h" ...

weixin_34209406的博客 105

Objective-C学习-数组排序问题

学到数组的时候,经常为了数据排序因为排序问题烦恼,其实objc为我们提供了很好的排序机制,如下代码加文字来解释一下        1.、最简单(也是最简单的方法) // // main.m // NSArraySort (数组排序)博客 // // Created by YueWen on 15/9/13. // Copyright (c) 2015年 YueWen. All

RITL_Y 1404

基于结构体数组的快速排序

用普通的数组快速排序,改造成任意数据的排序,比如结构体数组、链表、栈的排序等。只需要在排序中调用自己的compare函数,在其中把想要排序的值做一个比较即可,代码如下: #include <stdio.h> #include <strings.h> typedef int (*Z_COMPARE)(void* obj1, int obj1size, void* obj2, int obj2size); typedef struct { char name[20]; char b

Soky的博客 2583

iOS数组排序方法

1、利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1, id obj2){  if ([obj1 integerValue] > [obj2 integerValue]) {         return (NSComparisonResult)

King的专栏 1342

数组 排序

1、数组按照指定关键字升序 NSArray *sortedArray = [unSortedArray sortedArrayUsingComparator:^(id obj1,id obj2) {   //升序,key表示比较的关键字    if (obj1.key < obj1.key )   {      return NSOrderedAscending;   }   else   {      return NSOrderedDescending;   } } 2、数组按照指定

u013712343的博客 258

iOS开发中对数组元素进行排序

数组排序在实际开发中还是比较常用的, 因此对于各种排序方式一定要熟记于心

王俊岭的博客 3826

ios 数组排序

1.数组逆置(不排序,只是把数组元素逆置一下) //ObjectEnumerator        正序   //1.原始数组 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil]; //2.倒序的数组 NSArray* reversedArray = [[array reverse

u012409247的博客 472

iOS:字典数组排序

iphone开发数组排序(数组中包括字典)   1。普通数组排序:      NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil];      NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSCompar

Sparta-301 866
上一篇: MySQL表锁情况和文件打开数
edisonkun
博客等级 码龄24年 9粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值