Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- + (NSArray *)sortedArrayOfArray:(NSArray *)array
- {
- // Merge sort algorithm
- // If number of elements is bigger than 2, split in half and call sorting method recursively
- if ([array count] > 2) {
- int firstHalf = [array count] / 2;
- NSRange range;
- range.location = 0;
- range.length = firstHalf;
- NSArray *firstArray = [array subarrayWithRange:range];
- NSArray *sortedFirstHalf = [MergeSort sortedArrayOfArray:firstArray];
- range.location = firstHalf;
- range.length = [array count] - firstHalf;
- NSArray *secondArray = [array subarrayWithRange:range];
- NSArray *sortedSecondHalf = [MergeSort sortedArrayOfArray:secondArray];
- // merge arrays
- NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:array.count];
- int i = 0;
- int j = 0;
- for (int k = 0; k < array.count; k++) {
- if ((i != sortedFirstHalf.count) && (j != sortedSecondHalf.count)) {
- if ([[sortedFirstHalf objectAtIndex:i] intValue] < [[sortedSecondHalf objectAtIndex:j] intValue]) {
- [sortedArray addObject:[sortedFirstHalf objectAtIndex:i]];
- if (i < sortedFirstHalf.count) i++;
- } else {
- [sortedArray addObject:[sortedSecondHalf objectAtIndex:j]];
- if (j < sortedSecondHalf.count) j++;
- }
- } else if (i == sortedFirstHalf.count) {
- // All objects from first array used. Use only second array
- [sortedArray addObject:[sortedSecondHalf objectAtIndex:j]];
- if (j < sortedSecondHalf.count) j++;
- } else if (j == sortedSecondHalf.count){
- [sortedArray addObject:[sortedFirstHalf objectAtIndex:i]];
- if (i < sortedFirstHalf.count) i++;
- } else {
- // This shouldn't happen
- abort();
- }
- }
- return sortedArray;
- } else if ([array count] == 2) {
- // array of 2 elements
- if (array.count != 2) abort();
- if ([[array objectAtIndex:0] intValue] > [[array objectAtIndex:1] intValue]) {
- // if first number is bigger than second, swap values
- NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:2];
- [sortedArray addObject:[array objectAtIndex:1]];
- [sortedArray addObject:[array objectAtIndex:0]];
- return sortedArray;
- } else {
- // if first number is already smaller than (or equal to) second number, return
- return array;
- }
- } else if ([array count] == 1) {
- // Single element, return
- return array;
- }
- return array;
- }
Add Comment
Please, Sign In to add comment