Objective-c sort array int方法

本文介绍Objective-C中三种数组排序的方法:直接使用系统提供的排序方法、利用描述符进行排序及通过自定义比较方法实现排序。每种方法都有详细的代码示例。

(1)直接调用系统的方法排序int

NSMutableArray *array = [[NSMutableArray alloc]init];

[array addObject:[NSNumber numberWithInt:20]];

[array addObject:[NSNumber numberWithInt:1]];

[array addObject:[NSNumber numberWithInt:4]];

NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];

for(int i = 0; i < [sortedArray count]; i++)

{

int x = [[sortedArray objectAtIndex:i]intValue];

NSLog(@"######%d/n", x);

}


(2)用descriptor方法

#import <Cocoa/Cocoa.h>

 

@interface Node: NSObject {

int x;

int y;

int v;

}

 

@property int x;

@property int y;

@property int v;

- (id)init:(int)tx y:(int)ty v:(int)tv;

@end

 

@implementation Node

 

@synthesize x;

@synthesize y;

@synthesize v;

 

- (id)init:(int)tx y:(int)ty v:(int)tv {

x = tx;

y = ty;

v = tv;

return self;

}

 

@end

 

int main(int argc, char *argv[])

{

NSMutableArray *myMutableArray = [[NSMutableArray alloc]init];

Node *n[2];

n[0] = [[Node alloc]init:2 y:1 v:1];

n[1] = [[Node alloc]init:4 y:2 v:2];

 

[myMutableArray addObject:n[0]];

[myMutableArray addObject:n[1]];

NSSortDescriptor * sortByA = [NSSortDescriptor sortDescriptorWithKey:@"x" ascending:NO];

[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortByA]];

for(Node *t in myMutableArray) {

NSLog(@"x === %d", t.x);

NSLog(@"y === %d", t.y);

NSLog(@"v === %d", t.v);

}

}

 

 

(3)自定义重写方法

/*

 

Abstract: Constants returned by comparison functions, indicating whether a value is equal to, less than, or greater than another value.

Declaration: enum CFComparisonResult {

   kCFCompareLessThan = -1,

   kCFCompareEqualTo = 0,

   kCFCompareGreaterThan = 1

};

*/

#import <Cocoa/Cocoa.h>

@implementation NSNumber (MySort)

- (NSComparisonResult) myCompare:(NSString *)other {

    //这里可以作适当的修正后再比较

    int result = ([self intValue]>>1) - ([other intValue]>>1);

    //这里可以控制排序的顺序和逆序

    return result < 0 ? NSOrderedDescending : result > 0 ? NSOrderedAscending : NSOrderedSame;

}

 

@end

int main(int argc, char *argv[])

{

NSMutableArray *array = [[NSMutableArray alloc]init];

[array addObject:[NSNumber numberWithInt:20]];

[array addObject:[NSNumber numberWithInt:1]];

[array addObject:[NSNumber numberWithInt:4]];

NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(myCompare:)];

for(int i = 0; i < [sortedArray count]; i++)

{

int x = [[sortedArray objectAtIndex:i]intValue];

NSLog(@"######%d/n", x);

}

}

 

注:

关于 sortedArrayUsingSelector:@selector(copare:)是默认的排序方法,而你自己可以重写排序方法,比如上面的myCompare

### 桶排序(Bucket Sort)分配排序算法原理 桶排序是一种基于分布式的排序方法,特别适合于处理输入数据均匀分布在一定范围内的场景。该算法通过将数组中的元素分散到多个称为“桶”的子区间内,在每个桶内部执行进一步的排序操作来完成整体排序过程[^1]。 #### 工作流程概述 - **初始化阶段**:创建若干个空桶用于存储待分类的数据项; - **映射函数设计**:定义一个合适的哈希函数或映射规则,使得能够根据原始数值将其合理地划分至对应的桶中; - **填充各桶**:遍历原列表并将各个元素依据上述映射关系放置入相应的桶里; - **局部有序化**:针对每一个非空的桶单独实施某种稳定性的排序机制(可以采用其他经典排序技术如插入排序),从而保证单个桶里的所有成员已经按序排列好; - **汇总结果集**:最后依次访问所有的桶并收集其中已排好的序列片段拼接成最终完整的升序/降序表列[^2]。 对于特定类型的实数集合而言,比如位于\[0, 1\)区间的随机浮点数样本,由于这些值天然具备良好的离散特性,因此非常适合运用桶排序策略来进行高效整理而不必受限于传统比较型方案的时间复杂度瓶颈——即O(n log n)[^3]。 ### Objective-C 实现案例 下面给出了一段利用Objective-C编写的简单版本的`bucketSort:` 方法: ```objective-c #import <Foundation/Foundation.h> @interface NSArray (BucketSort) -(NSArray *)bucketSort; @end @implementation NSArray (BucketSort) // 辅助函数:对单个桶进行排序 static NSMutableArray *insertionSort(NSMutableArray *array) { for (NSUInteger i = 1; i < array.count; ++i) { id currentObject = [array objectAtIndex:i]; NSInteger j; for (j = i - 1; j >= 0 && [(NSNumber *)[array objectAtIndex:j] doubleValue] > [(NSNumber *)currentObject doubleValue]; --j) { [array exchangeObjectAtIndex:j + 1 withObjectAtIndex:j]; } [array insertObject:currentObject atIndex:j + 1]; } return array; } -(NSArray *)bucketSort { NSUInteger count = self.count; // 创建适当数量的桶 NSMutableArray<NSMutableArray *> *buckets = [[NSMutableArray alloc] init]; for (int i=0;i<count;++i){ [buckets addObject:[[NSMutableArray alloc]init]]; } // 将元素放入各自的桶中 for(id obj in self){ float value = [(NSNumber *)obj floatValue]; int index_buck = floor(value*count); [[buckets objectAtIndex:index_buck] addObject:obj]; } // 排序每个桶的内容 for(int i=0;i<buckets.count;++i){ buckets[i] = insertionSort(buckets[i]); } // 合并所有桶的结果 NSMutableArray *sortedArray = [[NSMutableArray alloc] init]; for (NSMutableArray *sublist in buckets) { [sortedArray addObjectsFromArray:sublist]; } return sortedArray.copy; } @end int main() { @autoreleasepool { NSArray *numbers = @[@0.78f,@0.17f,@0.39f,@0.26f,@0.72f,@0.94f,@0.21f,@0.12f,@0.23f,@0.68f]; NSLog(@"Original Array: %@", numbers); NSArray *result = [numbers bucketSort]; NSLog(@"Sorted Array: %@", result); } } ``` 这段代码展示了如何在Objective-C环境中实现基本形式的桶排序逻辑,并且包含了必要的辅助功能以确保整个程序结构清晰易懂。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值