Guest User

Quicksort.m (Quicksort GCD Test)

a guest
Nov 27th, 2011
472
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //
  2. //  QuickSort.m
  3. //  Quicksort
  4. //
  5. //  Created by Craig Otis on 11/27/11.
  6. //  Copyright (c) 2011 Home. All rights reserved.
  7. //
  8.  
  9. #import "QuickSort.h"
  10.  
  11. @implementation QuickSort
  12.  
  13. + (NSArray *)sort:(NSMutableArray *)input useGCD:(BOOL)useGCD {
  14.     if ([input count] <= 1) {
  15.         return input;
  16.     }
  17.     // Find a pivot, we just pick the middle
  18.     NSUInteger pivotIndex = [input count] / 2;
  19.     NSNumber *pivotObj = [input objectAtIndex:pivotIndex];
  20.     int pivot = [pivotObj intValue];
  21.    
  22.     // Create empty less/greater arrays
  23.     NSMutableArray *less = [[NSMutableArray alloc] init];
  24.     NSMutableArray *greater = [[NSMutableArray alloc] init];
  25.    
  26.     // Populate less/greater arrays
  27.     for (NSUInteger idx = 0; idx < [input count]; idx++) {
  28.         if (idx == pivotIndex) {
  29.             continue;
  30.         }
  31.         if ([[input objectAtIndex:idx] intValue] <= pivot) {
  32.             [less addObject:[input objectAtIndex:idx]];
  33.         } else {
  34.             [greater addObject:[input objectAtIndex:idx]];
  35.         }
  36.     }
  37.    
  38.     // Merge the less/greater arrays, with pivot in the center
  39.     NSMutableArray *concat = [[NSMutableArray alloc] init];
  40.     if (useGCD) {
  41.         // Create semaphore and sort the left side
  42.         dispatch_semaphore_t lessSem = dispatch_semaphore_create(1);
  43.         __block NSArray *lessSorted = nil;
  44.        
  45.         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
  46.             lessSorted = [QuickSort sort:less useGCD:useGCD];
  47.             dispatch_semaphore_signal(lessSem);
  48.         });
  49.        
  50.         // Create semaphore and sort the right side
  51.         dispatch_semaphore_t moreSem = dispatch_semaphore_create(1);
  52.         __block NSArray *moreSorted = nil;
  53.        
  54.         dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
  55.             moreSorted = [QuickSort sort:greater useGCD:useGCD];
  56.             dispatch_semaphore_signal(moreSem);
  57.         });
  58.        
  59.         // Wait for both sides to finish sorting
  60.         dispatch_semaphore_wait(lessSem, DISPATCH_TIME_FOREVER);
  61.         dispatch_semaphore_wait(moreSem, DISPATCH_TIME_FOREVER);
  62.        
  63.        
  64.         // Merge
  65.         [concat addObjectsFromArray:lessSorted];
  66.         [less release];
  67.         [concat addObject:pivotObj];
  68.         [concat addObjectsFromArray:moreSorted];
  69.         [greater release];
  70.     } else {
  71.         // Merge
  72.         [concat addObjectsFromArray:[QuickSort sort:less useGCD:useGCD]];
  73.         [less release];
  74.         [concat addObject:pivotObj];
  75.         [concat addObjectsFromArray:[QuickSort sort:greater useGCD:useGCD]];
  76.         [greater release];
  77.     }
  78.     return [concat autorelease];
  79. }
  80.  
  81. + (BOOL)testArray:(NSArray *)input {
  82.     int last = INT_MIN;
  83.     for (int i = 0; i < [input count]; i++) {
  84.         int val = [[input objectAtIndex:i] intValue];
  85.         if (val < last) {
  86.             return NO;
  87.         }
  88.         last = val;
  89.     }
  90.     return YES;
  91. }
  92.  
  93. @end
  94.  
  95.  
Advertisement
Add Comment
Please, Sign In to add comment