This is quite plain vanilla, but I'm hoping for Objective-C specific feedback. Also I'd be interested in what folks think about sorting in Objective-C vs. doing all sorting in C or C++ (and which?) even in an app.
- (NSMutableArray *) quickSort: (NSMutableArray *)toSort{
for(NSNumber *arrayMember in toSort){
if(![arrayMember respondsToSelector:@selector(doubleValue)]){
NSLog(@"incorrect types in input array, returning nil");
return nil;
}
}
int intLength = toSort.count;
if (intLength == 0){
return toSort;
}
else if (intLength == 1){
return toSort;
}else if (intLength==2){
if ([toSort[0] doubleValue] <= [toSort[1] doubleValue]) {
return toSort;
}else{
NSNumber *temp = [toSort objectAtIndex:0];
[toSort replaceObjectAtIndex:0 withObject:[toSort objectAtIndex:1]];
[toSort replaceObjectAtIndex:1 withObject:temp];
return toSort;
}
}
int r = arc4random_uniform(intLength);
double pivot = [[toSort objectAtIndex:r] doubleValue];
NSMutableArray *lowArray = [NSMutableArray array];
NSMutableArray *highArray = [NSMutableArray array];
NSMutableArray *equalArray = [NSMutableArray array];
for(int i = 0; i < intLength; i++){
double arrayMember = [[toSort objectAtIndex:i] doubleValue];
if (arrayMember < pivot) {
[lowArray addObject:[NSNumber numberWithDouble:arrayMember]];
}else if (arrayMember > pivot){
[highArray addObject:[NSNumber numberWithDouble:arrayMember]];
}else{
[equalArray addObject:[NSNumber numberWithDouble:arrayMember]];
}
}
NSMutableArray *returnLeft = [self quickSort:lowArray];
NSMutableArray *returnRight = [self quickSort:highArray];
NSMutableArray *returnArray = returnLeft;
[returnArray addObjectsFromArray:equalArray];
[returnArray addObjectsFromArray:returnRight];
return returnArray;
}
This function is written to sort NSNumbers
formed from doubles. Here's a sample call:
NSNumber *number3 = [NSNumber numberWithDouble:92.3];
NSNumber *number1 = [NSNumber numberWithDouble:2.3];
NSNumber *number2 = [NSNumber numberWithDouble:4.3];
NSNumber *number5 = [NSNumber numberWithDouble:5.3];
NSNumber *number4 = [NSNumber numberWithDouble:-5.3];
NSMutableArray *toSort = @[number1, number2, number3, number4, number5];
NSMutableArray *sorted = [self quickSort:toSort];
NSLog(@"here's sorted array: %@", sorted);
NSMutableArray
, then why wouldn't you just use the built-in- sortUsingComparator:
method? – JS1 Jul 20 '15 at 23:09sortUsingComparator:
uses is undocumented. And it's implementation details are subject to change without notice. It may or may not be a quick sort. And while I'm no sorting expert, I believe that different sort algorithms are more efficient in different scenarios. – nhgrif Jul 21 '15 at 19:44