Guest User

Untitled

a guest
Oct 19th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. + (NSArray *)sortedArrayOfArray:(NSArray *)array
  2. {
  3. // Merge sort algorithm
  4.  
  5. // If number of elements is bigger than 2, split in half and call sorting method recursively
  6. if ([array count] > 2) {
  7.  
  8. int firstHalf = [array count] / 2;
  9.  
  10. NSRange range;
  11. range.location = 0;
  12. range.length = firstHalf;
  13.  
  14. NSArray *firstArray = [array subarrayWithRange:range];
  15. NSArray *sortedFirstHalf = [MergeSort sortedArrayOfArray:firstArray];
  16.  
  17. range.location = firstHalf;
  18. range.length = [array count] - firstHalf;
  19.  
  20. NSArray *secondArray = [array subarrayWithRange:range];
  21. NSArray *sortedSecondHalf = [MergeSort sortedArrayOfArray:secondArray];
  22.  
  23. // merge arrays
  24. NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:array.count];
  25. int i = 0;
  26. int j = 0;
  27.  
  28. for (int k = 0; k < array.count; k++) {
  29. if ((i != sortedFirstHalf.count) && (j != sortedSecondHalf.count)) {
  30. if ([[sortedFirstHalf objectAtIndex:i] intValue] < [[sortedSecondHalf objectAtIndex:j] intValue]) {
  31. [sortedArray addObject:[sortedFirstHalf objectAtIndex:i]];
  32. if (i < sortedFirstHalf.count) i++;
  33. } else {
  34. [sortedArray addObject:[sortedSecondHalf objectAtIndex:j]];
  35. if (j < sortedSecondHalf.count) j++;
  36. }
  37. } else if (i == sortedFirstHalf.count) {
  38. // All objects from first array used. Use only second array
  39. [sortedArray addObject:[sortedSecondHalf objectAtIndex:j]];
  40. if (j < sortedSecondHalf.count) j++;
  41. } else if (j == sortedSecondHalf.count){
  42. [sortedArray addObject:[sortedFirstHalf objectAtIndex:i]];
  43. if (i < sortedFirstHalf.count) i++;
  44. } else {
  45. // This shouldn't happen
  46. abort();
  47. }
  48. }
  49.  
  50. return sortedArray;
  51.  
  52. } else if ([array count] == 2) {
  53. // array of 2 elements
  54. if (array.count != 2) abort();
  55.  
  56. if ([[array objectAtIndex:0] intValue] > [[array objectAtIndex:1] intValue]) {
  57. // if first number is bigger than second, swap values
  58. NSMutableArray *sortedArray = [[NSMutableArray alloc] initWithCapacity:2];
  59. [sortedArray addObject:[array objectAtIndex:1]];
  60. [sortedArray addObject:[array objectAtIndex:0]];
  61.  
  62. return sortedArray;
  63. } else {
  64. // if first number is already smaller than (or equal to) second number, return
  65. return array;
  66. }
  67. } else if ([array count] == 1) {
  68. // Single element, return
  69. return array;
  70. }
  71.  
  72. return array;
  73. }
Add Comment
Please, Sign In to add comment