快速排序的理解

快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。通过一趟扫描,确保以某个数为基准点的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。

简单的说就是

找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体, 左边:继续选择基准数把小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边,右边也是一样..直到各区间只有一个数位置.

借用别人的这张图片,觉得把快排表达的很明显
这里写图片描述

定义一个数组

 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值