快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。通过一趟扫描,确保以某个数为基准点的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
简单的说就是
找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体, 左边:继续选择基准数把小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边,右边也是一样..直到各区间只有一个数位置.
借用别人的这张图片,觉得把快排表达的很明显
定义一个数组
NSMutableArray *numberArray = [NSMutableArray arrayWithObjects:
[NSNumber numberWithInt:7],
[NSNumber numberWithInt:12],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:45],
[NSNumber numberWithInt:20], nil];
声明一个方法 传入排序数组、开始索引、结束索引
-(void)QuickSort:(NSMutableArray *)array StartIndex:(NSInteger)startIndex EndIndex:(NSInteger)endIndex {
if (startIndex >= endIndex) return; //说明排序完成
NSNumber *baseNumber = [array objectAtIndex:startIndex]; //取数组第0个元素为基准数
NSInteger tempIndex = startIndex; //创建一个临时索引 处理交换位置(也就是下一个交换对象的位置)
for (int i = (int)startIndex + 1; i <= (int)endIndex; i++) {
NSNumber *temp = [array objectAtIndex:i];
if ([temp intValue] > [baseNumber intValue]) {
tempIndex = tempIndex + 1;
[array exchangeObjectAtIndex:tempIndex withObjectAtIndex:i];
}
}
[array exchangeObjectAtIndex:tempIndex withObjectAtIndex:startIndex];
[self QuickSort:array StartIndex:startIndex EndIndex:tempIndex-1]; //继续处理左边的,这里是一个递归的过程
[self QuickSort:array StartIndex:tempIndex+1 EndIndex:endIndex]; //继续处理右边的,这里是一个递归的过程
NSLog(@"array %@",array);
}
iOS也为我们提供方法让我们实现对数组的快排
方法1: NSComparator
NSArray *sortedArray = [numberArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
int val1 = [obj1 intValue];
int val2 = [obj2 intValue];
if (val1 > val2) {
return NSOrderedDescending;//降序
} else {
return NSOrderedAscending ;//升序
}
}];
NSLog(@"%@",sortedArray);
方法2: NSSortDescriptor
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:nil ascending:YES];//ascending控制升序还是降序
NSArray *sortArray = [NSArray arrayWithObjects:descriptor, nil];
NSArray *sortedArray = [numberArray sortedArrayUsingDescriptors:sortArray];
NSLog(@"%@",sortedArray);
也可以把这个方法封装成函数
-(void)changeArray:(NSMutableArray *)dicArray orderWithKey:(NSString *)key
ascending:(BOOL)yesOrNo {
// dicArray:待排序的NSMutableArray。
// key:按照排序的key。
// yesOrNo:升序或降序排列,yes为升序,no为降序。
NSSortDescriptor *distanceDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:yesOrNo];
NSArray *descriptors = [NSArray arrayWithObjects:distanceDescriptor,nil];
[dicArray sortUsingDescriptors:descriptors];
NSLog(@"%@dic ",dicArray);
}