快排:快速度排序是经典的divide & conquer (分治算法)
思想:
- 在数组中取得一个值为标兵
- 对标兵左右区间进行划分,将比标兵大的放到又边,小的放到左边,倒序反之。
- 重复上过程,到对比结束
代码如下:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *dataSorce = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(5),@(9),@(4),@(3),@(7),nil];
[self quickExhaut:dataSorce WhithLeft:0 AndRight:dataSorce.count-1];
NSLog(@"dataSorce value is%@",dataSorce);
}
-(void)quickExhaut:(NSMutableArray *)dateSource WhithLeft:(NSInteger )left AndRight:(NSInteger)right{
if (left>=right) {
return;
}
NSInteger i = left;
NSInteger j = right;
//标兵值
NSInteger key = [dateSource [i] integerValue];
//查询
while (i<j) {
while (i<j && [dateSource[j] integerValue] >= key) {
j--;
}
//如果小于标兵就放到前面
dateSource[i]= dateSource[j] ;
while (i<j && [dateSource[i] integerValue]<=key) {
i++;
}
dateSource[j] = dateSource[i];
}
//排序基准数左边的
dateSource[i] = @(key);
[self quickExhaut:dateSource WhithLeft:left AndRight:i - 1];
//排序基准数右边的
[self quickExhaut:dateSource WhithLeft:i + 1 AndRight:right];
}