本文共 7328 字,大约阅读时间需要 24 分钟。
快速排序是一种高效的排序算法,采用分治法策略对数据进行排序。本文将详细介绍如何在 Objective-C 中实现快速排序。
首先,我们需要导入必要的头文件以确保代码的正常编译和运行。
#import
接下来,我们定义快速排序的接口类 QuickSort,该类将提供快速排序的功能。
@interface QuickSort : NSObject- (NSArray *)quickSort:(NSArray *)array;- (NSArray *)quickSort:(NSArray *)array partition:(NSInteger)partitionIndex;- (NSArray *)quickSortHelper:(NSArray *)array low:(NSInteger)low index:(NSInteger)index high:(NSInteger)high;- (NSArray *)quickSortHelperPartition:(NSArray *)array low:(NSInteger)low high:(NSInteger)high;- (void)swap:(id)a :(id)b inArray:(NSArray *)array;- (NSInteger)partition:(NSArray *)array;- (void)printArray:(NSArray *)array;- (void)printElement:(id)element;- (void)printFunctionName:(NSString *)functionName;- (void)printError:(NSError *)error;@end
以下是实现快速排序的主要方法 quickSort。
- (NSArray *)quickSort:(NSArray *)array{ [self printFunctionName:@"quickSort"]; return [self quickSortHelper:array low:0 index:0 high:[array count]-1];} 以下是一些辅助方法,用于支持快速排序的实现。
- (NSArray *)quickSortHelper:(NSArray *)array low:(NSInteger)low index:(NSInteger)index high:(NSInteger)high{ [self printFunctionName:@"quickSortHelper"]; if (low >= high) { return array; } NSInteger pivot = [self partition:array]; NSArray *left = [self quickSortHelper:array low:low index:index pivot:pivot-1]; NSArray *right = [self quickSortHelper:array low:index+1 high:high pivot:pivot]; [self swap:array[index] : array[pivot] inArray:array]; return [self concatenateArrays:array left:right];} - (NSArray *)quickSortHelperPartition:(NSArray *)array low:(NSInteger)low high:(NSInteger)high{ [self printFunctionName:@"quickSortHelperPartition"]; if (low >= high) { return array; } NSInteger pivot = [self partition:array]; NSArray *left = [self quickSortHelper:array low:low index:index pivot:pivot-1]; NSArray *right = [self quickSortHelper:array low:index+1 high:high pivot:pivot]; [self swap:array[index] : array[pivot] inArray:array]; return [self concatenateArrays:array left:right];} 以下是用于交换数组中两个元素的方法。
- (void)swap:(id)a :(id)b inArray:(NSArray *)array{ [self printFunctionName:@"swap"]; id temp = a; a = b; b = temp;} 以下是用于确定分区的函数。
- (NSInteger)partition:(NSArray *)array{ [self printFunctionName:@"partition"]; int left = 0; int right = [array count] - 1; int pivot = left + ((right - left + 1) / 2); id a = [array objectAtIndex:pivot]; [self printElement:a]; id b = [array objectAtIndex:0]; [self printElement:b]; id c = [array objectAtIndex:[array count] - 1]; [self printElement:c]; [self printArray:array]; return pivot;} 以下是用于拼接两个数组的方法。
- (NSArray *)concatenateArrays:(NSArray *)array left:(NSArray *)left right:(NSArray *)right{ [self printFunctionName:@"concatenateArrays"]; return [array arrayByConcatenating: left arrayByAdding: right];} 以下是用于打印数组内容的方法。
- (void)printArray:(NSArray *)array{ [self printFunctionName:@"printArray"]; NSLog(@"Array: %@", array);} 以下是用于打印单个元素的方法。
- (void)printElement:(id)element{ [self printFunctionName:@"printElement"]; NSLog(@"Element: %@", element);} 以下是用于打印函数名称的方法。
- (void)printFunctionName:(NSString *)functionName{ [self printElement: functionName];} 以下是用于打印错误信息的方法。
- (void)printError:(NSError *)error{ [self printFunctionName:@"printError"]; NSLog(@"Error: %@", error);} 以下是一个快速排序的主函数示例。
int main(int argc, const char *argv){ @autoreleasepool { NSArray *inputArray = [NSArray arrayWithObjects: @"John", @"Tom", @"Alice", @"Bob", @"Charlie"]; NSArray *sortedArray = [QuickSort new].quickSort(inputArray); NSLog(@"Sorted Array: %@", sortedArray); } return 0;} 以下是完整的代码实现。
#import@interface QuickSort : NSObject- (NSArray *)quickSort:(NSArray *)array;- (NSArray *)quickSort:(NSArray *)array partition:(NSInteger)partitionIndex;- (NSArray *)quickSortHelper:(NSArray *)array low:(NSInteger)low index:(NSInteger)index high:(NSInteger)high);- (NSArray *)quickSortHelperPartition:(NSArray *)array low:(NSInteger)low high:(NSInteger)high);- (void)swap:(id)a :(id)b inArray:(NSArray *)array;- (NSInteger)partition:(NSArray *)array;- (void)printArray:(NSArray *)array;- (void)printElement:(id)element;- (void)printFunctionName:(NSString *)functionName;- (void)printError:(NSError *)error;@end@implementation QuickSort- (NSArray *)quickSort:(NSArray *)array{ [self printFunctionName:@"quickSort"]; return [self quickSortHelper:array low:0 index:0 high:[array count]-1];}- (NSArray *)quickSortHelper:(NSArray *)array low:(NSInteger)low index:(NSInteger)index high:(NSInteger)high{ [self printFunctionName:@"quickSortHelper"]; if (low >= high) { return array; } NSInteger pivot = [self partition:array]; NSArray *left = [self quickSortHelper:array low:low index:index pivot:pivot-1]; NSArray *right = [self quickSortHelper:array low:index+1 high:high pivot:pivot]; [self swap:array[index] : array[pivot] inArray:array]; return [self concatenateArrays:array left:right];}- (NSArray *)quickSortHelperPartition:(NSArray *)array low:(NSInteger)low high:(NSInteger)high{ [self printFunctionName:@"quickSortHelperPartition"]; if (low >= high) { return array; } NSInteger pivot = [self partition:array]; NSArray *left = [self quickSortHelper:array low:low index:index pivot:pivot-1]; NSArray *right = [self quickSortHelper:array low:index+1 high:high pivot:pivot]; [self swap:array[index] : array[pivot] inArray:array]; return [self concatenateArrays:array left:right];}- (void)swap:(id)a :(id)b inArray:(NSArray *)array{ [self printFunctionName:@"swap"]; id temp = a; a = b; b = temp;}- (NSInteger)partition:(NSArray *)array{ [self printFunctionName:@"partition"]; int left = 0; int right = [array count] - 1; int pivot = left + ((right - left + 1) / 2); id a = [array objectAtIndex:pivot]; [self printElement:a]; id b = [array objectAtIndex:0]; [self printElement:b]; id c = [array objectAtIndex:[array count] - 1]; [self printElement:c]; [self printArray:array]; return pivot;}- (NSArray *)concatenateArrays:(NSArray *)array left:(NSArray *)left right:(NSArray *)right{ [self printFunctionName:@"concatenateArrays"]; return [array arrayByConcatenating: left arrayByAdding: right];}- (void)printArray:(NSArray *)array{ [self printFunctionName:@"printArray"]; NSLog(@"Array: %@", array);}- (void)printElement:(id)element{ [self printFunctionName:@"printElement"]; NSLog(@"Element: %@", element);}- (void)printFunctionName:(NSString *)functionName{ [self printElement: functionName];}- (void)printError:(NSError *)error{ [self printFunctionName:@"printError"]; NSLog(@"Error: %@", error);}int main(int argc, const char *argv){ @autoreleasepool { NSArray *inputArray = [NSArray arrayWithObjects: @"John", @"Tom", @"Alice", @"Bob", @"Charlie"]; NSArray *sortedArray = [QuickSort new].quickSort(inputArray); NSLog(@"Sorted Array: %@", sortedArray); } return 0;}
转载地址:http://ilifk.baihongyu.com/