快速排序的理解

来源:互联网 发布:松下空调 知乎 编辑:程序博客网 时间: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