OC内部sortedArrayUsingComparator实现数组排序原理

在IOS OC中集合都支持排序,尤其是有序数组NSArray,NSMutableArray更是有强大的排序算法供我们使用。其中一个方法是sortedArrayUsingComparator,根据传入的block比较函数来定义排序规则,非常方便,加下来就探究一下其排序原理。

先看看对象的排序:

OC内部sortedArrayUsingComparator实现数组排序原理      再看看数组的排序:

  1. NSComparator cmp = ^(id obj1, id obj2) {
  2.  if ([obj1 integerValue] > [obj2 integerValue]) {
  3.         return (NSComparisonResult)NSOrderedDescending;
  4.     }
  5.     if ([obj1 integerValue] < [obj2 integerValue]) {
  6.         return (NSComparisonResult)NSOrderedAscending;
  7.     }
  8.     return (NSComparisonResult)NSOrderedSame;
  9. };
  10. NSArray *sortArray = [[NSArray alloc] initWithObjects:@"1",@"3",@"4",@"7",@"8",@"2",@"6",@"5",@"13",@"15",@"12",@"20",@"28",@"",nil];
  11.  //排序前
  12.  NSMutableString *outputStr = [[NSMutableString alloc] init];
  13.  for(NSString *str in sortArray){
  14.   [outputStr appendFormat:@"];
  15.  }
  16.  NSLog(@"排序前:%@",outputStr);
  17.  //排序方式
  18.  NSArray *array = [sortArray sortedArrayUsingComparator:cmp];
  19.  NSMutableString *outputStr = [[NSMutableString alloc] init];
  20.  for(NSString *str in array){
  21.   [outputStr appendFormat:@"];
  22.  }
  23.  NSLog(@"排序后:%@",outputStr);

有的人修改了对象的字段数值,发现排序方式没有改变,这不是掩耳盗铃吗?如果修改数据源能改变排序方式那么数据变了是不是算法就不确定了?!所以,这里的排序方式主要看Comparator方法定义。

我们看到苹果官方文档这么描述:直达链接

sortedArrayUsingComparator:
Returns an array that lists the receiving array’s elements in ascending order, as determined by the comparison method specified by a given NSComparator Block.

所以sortedArrayUsingComparator这个方法就是按递增的方式排序,而Comparator就是最终决定以什么方式排序。

Comparator的返回结构枚举类型含义:

NSOrderedAscending

The left operand is smaller than the right operand.

NSOrderedSame

The two operands are equal.

NSOrderedDescending

The left operand is greater than the right operand.

可见,如果按照对象一个字段大小从小到大排序,那么返回NSOrderedAscending即可,其他以此类推。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: