美文网首页
iOS数组排序方法

iOS数组排序方法

作者: sweetpf | 来源:发表于2017-08-18 17:37 被阅读777次

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

    二叉树

    快速排序

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

    基础

    compare:

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

    NSComparisonResult:

    typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
    

    NSComparisonResult为枚举类型,其中:

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

    排序方案

    使用NSComparator排序

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

    使用NSDescriptor排序(NSSet,NSArray,NSMutableArray)

    单关键字排序

    NSMutableArray *array = [NSMutableArray array];    
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES];
    [array sortUsingDescriptors:[NSArray arrayWithObject:sort]]; 
    

    多关键字排序

    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)的几种排序方法中效率较高,因此我们也对比以一下快排的表现,下面是快排的代码(摘自网友,感谢):

    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方法,效率而言还是相当高的,这也是苹果开发者相对而言方便的地方。

    相关文章

      网友评论

          本文标题:iOS数组排序方法

          本文链接:https://www.haomeiwen.com/subject/qwparxtx.html