排序算法的OC实现
冒泡排序:
+ (NSArray *)bubbleSort:(NSArray<NSNumber *> *)array { if (!array || [array count] == 0) { return nil; } NSLog(@"😈😈😈😈冒泡排序😈😈😈😈"); NSInteger i; NSInteger j; NSInteger count = [array count]; NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array]; for (i = 0; i < count - 1; i++) { for (j = count - 1; j > i; j--) { if ([resultArray[j - 1] compare:resultArray[j]] == NSOrderedDescending ) { [resultArray exchangeObjectAtIndex:j - 1 withObjectAtIndex:j]; } } NSLog(@"第%ld趟:%@", (long)(i + 1), resultArray); } return [resultArray copy]; }
选择排序:
+ (NSArray *)selectionSort:(NSArray<NSNumber *> *)array { if (!array || [array count] == 0) { return nil; } NSLog(@"😈😈😈😈选择排序😈😈😈😈"); NSInteger i; NSInteger j; NSInteger count = [array count]; NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array]; for (i = 0; i < count - 1; i++) { NSInteger minimum = i; for (j = minimum + 1; j < count; j++) { if ([resultArray[minimum] compare:resultArray[j]] == NSOrderedDescending) { minimum = j; } } [resultArray exchangeObjectAtIndex:i withObjectAtIndex:minimum]; NSLog(@"第%ld趟:%@", (long)(i + 1), resultArray); } return [resultArray copy]; }
插入排序:
+ (NSArray *)insertionSort:(NSArray<NSNumber *> *)array { if (!array || [array count] == 0) { return nil; } NSLog(@"😈😈😈😈插入排序😈😈😈😈"); NSInteger i; NSInteger j; NSInteger count = [array count]; NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithObject:array[0]]; for (i = 1; i < count; i++) { NSInteger insertTag = i; for (j = i - 1; j >= 0 && [array[i] compare:resultArray[j]] == NSOrderedAscending; j--) { insertTag = j; } [resultArray insertObject:array[i] atIndex:insertTag]; NSLog(@"第%ld趟:%@", (long)i, resultArray); } return [resultArray copy]; }
快速排序:
void quickSort(NSMutableArray<NSNumber *> *resultArray, NSInteger left, NSInteger right) { if (left > right) { return; } NSInteger i = left; NSInteger j = right; NSNumber *key = resultArray[left]; while (i != j) { while (SameOrDes && j > i) { j--; } [resultArray exchangeObjectAtIndex:i withObjectAtIndex:j]; while (SameOrAsc && j > i) { i++; } [resultArray exchangeObjectAtIndex:i withObjectAtIndex:j]; } quickSort(resultArray, left, i - 1); quickSort(resultArray, i + 1, right); } + (NSArray *)quickSort:(NSArray<NSNumber *> *)array left:(NSInteger)left right:(NSInteger)right { if (!array || [array count] == 0) { return nil; } NSLog(@"😈😈😈😈快速排序😈😈😈😈"); NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array]; quickSort(resultArray, left, right); return [resultArray copy]; }
归并排序:
//归并 void merge(NSMutableArray<NSNumber *> *resultArray, NSMutableArray<NSNumber *> *tempArray, NSInteger left, NSInteger right, NSInteger middle) { NSInteger leftPoint = left; NSInteger rightPoint = middle + 1; NSInteger tempPoint = 0; while (leftPoint <= middle && rightPoint <= right) { if ([resultArray[leftPoint] compare:resultArray[rightPoint]] == NSOrderedAscending) { tempArray[tempPoint++] = resultArray[leftPoint++]; }else { tempArray[tempPoint++] = resultArray[rightPoint++]; } } while (leftPoint <= middle) { tempArray[tempPoint++] = resultArray[leftPoint++]; } while (rightPoint <= right) { tempArray[tempPoint++] = resultArray[rightPoint++]; } tempPoint = 0; //将temp中的元素全部拷贝到原数组中 while(left <= right){ resultArray[left++] = tempArray[tempPoint++]; } } //递归拆分后再归并 void mergeSort(NSMutableArray<NSNumber *> *resultArray, NSMutableArray<NSNumber *> *tempArray, NSInteger left, NSInteger right) { if (left < right) { NSInteger middle = (left + right) / 2; mergeSort(resultArray, tempArray, left, middle); mergeSort(resultArray, tempArray, middle + 1, right); merge(resultArray, tempArray, left, right, middle); } } + (NSArray *)mergeSort:(NSArray<NSNumber *> *)array { if (!array || [array count] == 0) { return nil; } NSLog(@"😈😈😈😈归并排序😈😈😈😈"); NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array]; NSMutableArray<NSNumber *> *tempArray = [NSMutableArray arrayWithCapacity:[array count]]; mergeSort(resultArray, tempArray, 0, [array count] - 1); return [resultArray copy]; }