前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS数组排序方法

iOS数组排序方法

作者头像
sweet说好的幸福
发布2020-12-23 10:59:57
1.2K0
发布2020-12-23 10:59:57
举报
文章被收录于专栏:sweet_iOSsweet_iOS

先回忆一下,大学期间学到的排序算法你还记得多少?? 那先充电一下常用排序算法总结,当然,google搜索"排序算法"会非常多,这个链接只是随意看到查看的,仅供参考。

二叉树

快速排序

当然,作为ios开发者,什么冒泡排序,堆排序,快速排序等等,好像都与我们无关, 因为我们有“sort”尚方宝剑。

基础

compare:

字符串比较大小的函数,返回NSComparisonResult

NSComparisonResult:
代码语言:javascript
复制
typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};

NSComparisonResult为枚举类型,其中:

  • NSOrderedAscending:左边的操作对象小于右边的对象
  • NSOrderedSame:左右两边对象相等
  • NSOrderedDescending:左边的操作对象大于右边的对象

排序方案

使用NSComparator排序
代码语言:javascript
复制
NSArray *sortedArray = [unSortedArray sortedArrayUsingComparator:^(id obj1,id obj2)
{
  //升序,key表示比较的关键字
   if (obj1.key < obj1.key )
  {
     return NSOrderedAscending;
  }
  else
  {
     return NSOrderedDescending;
  }
}
使用NSDescriptor排序(NSSet,NSArray,NSMutableArray)

单关键字排序

代码语言:javascript
复制
NSMutableArray *array = [NSMutableArray array];    
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES];
[array sortUsingDescriptors:[NSArray arrayWithObject:sort]]; 

多关键字排序

代码语言:javascript
复制
NSMutableArray *array = [NSMutableArray array];  
......  
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"key1" ascending:YES];  
NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"key2" ascending:NO];  
[array sortUsingDescriptors:[NSArray arrayWithObjects:sort1, sort2, nil]];

其中ascending为YES表示升序排列。

快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此我们也对比以一下快排的表现,下面是快排的代码(摘自网友,感谢):

代码语言:javascript
复制
void quickSort(NSMutableArray *array, NSInteger first, NSInteger last, NSComparator comparator) 
{
    if (first >= last) return;
    id pivot = array[(first + last) / 2];
    NSInteger left = first;
    NSInteger right = last;
    while (left <= right) {
        while (comparator(array[left], pivot) == NSOrderedAscending)
            left++;
        while (comparator(array[right], pivot) == NSOrderedDescending)
            right--;
        if (left <= right)
            [array exchangeObjectAtIndex:left++ withObjectAtIndex:right--];
    }
    quickSort(array, first, right, comparator);
    quickSort(array, left, last, comparator);
}

NSArray* sort(NSArray *unsorted, NSComparator comparator)
{
    NSMutableArray *a = [NSMutableArray arrayWithArray:unsorted];
    quickSort(a, 0, a.count - 1, comparator);return a;
}
  sortedArray = sort(array, ^(id obj1, id obj2)
                       {
                           Topic *topic1 = (Topic*)obj1;
                           Topic *topic2 = (Topic*)obj2;
                           NSNumber *val1 =[NSNumber numberWithLong:topic1.ID];
                           NSNumber *val2 = [NSNumber numberWithLong:topic2.ID];
                           return [val1 compare:val2];
                       });

小结

建议在需要排序的时候采用系统自带的NSComparator或NSDescriptor方法,效率而言还是相当高的,这也是苹果开发者相对而言方便的地方。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二叉树
  • 快速排序
  • 基础
    • compare:
      • NSComparisonResult:
      • 排序方案
        • 使用NSComparator排序
          • 使用NSDescriptor排序(NSSet,NSArray,NSMutableArray)
            • 快速排序
            • 小结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档