快速排序的理解
来源:互联网 发布:松下空调 知乎 编辑:程序博客网 时间:2024/05/01 03:29
快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。通过一趟扫描,确保以某个数为基准点的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
简单的说就是
找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体, 左边:继续选择基准数把小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边,右边也是一样..直到各区间只有一个数位置.
借用别人的这张图片,觉得把快排表达的很明显
定义一个数组
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);}
1 0
- 快速排序的理解
- 快速排序的理解
- 快速排序的理解
- 快速排序的理解
- 简单理解的快速排序
- 一个快速排序的理解
- 快速排序算法的理解
- 快速排序法的理解
- 快速排序算法的理解
- 快速理解快速排序
- 我对快速排序的理解。
- 一个好理解的快速排序
- 一个好理解的快速排序
- 深入理解快速排序算法的稳定性
- 对快速排序的一些理解
- 快速排序的理解与深入
- 快速排序(更好理解)
- 快速排序(更好理解)
- Make a difference with Dragon Board410c(1)
- 从程序员到CTO的Java技术路线图
- Go CopyFile 异常处理 实现
- Android数据库中增删改查数据
- callgrind使用说明(一款可以生成c++或c运行堆栈性能的工具)
- 快速排序的理解
- 表达式、运算符、语句
- Android中用注解和反射实现控件的绑定
- 【LEETCODE】283-Move Zeroes
- 京东商品详情页碎碎念
- 《统计学习方法》学习笔记(二):感知机
- 传入一个年份,求该年不是闰年——C语言函数
- iOS中Block介绍 内存管理与其他特性
- Gradle