天天看點

iOS數組排序方法

先回憶一下,大學期間學到的排序算法你還記得多少??

那先充電一下常用排序算法總結,當然,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方法,效率而言還是相當高的,這也是蘋果開發者相對而言友善的地方。