iOS 快速排序练习

2020-02-26  本文已影响0人  万年老参

简单写一个快速排序,

-(void)fastLineAry:(NSMutableArray *)ary from:(int)from to:(int)to
{
    int end = to;
    if (to - from >0) {
        int mid = (from +to)/2;
        for (int n = from; n<=end; n++) {
            if ([ary[n] intValue] >[ary[mid] intValue] && n<mid) {
                NSString *str = ary[n];
                [ary removeObjectAtIndex:n];
              //[ary removeObject: str];
                [ary insertObject:str atIndex:to];
                n = n -1;
                end = end -1;
                mid = mid -1;
            }else if([ary[n] intValue]<[ary[mid] intValue] && n>mid){
                NSString *str = ary[n];
                [ary removeObjectAtIndex:n];
              //[ary removeObject: str];
                [ary insertObject:str atIndex:from];
                mid = mid +1;
            }
        }
        NSString *logStr =  [ary componentsJoinedByString:@","];
        NSLog(@"完成一轮比较:\n%@",logStr);
        if(mid - from > 1){
            [self fastLineAry:ary from:from to:mid-1];
        }
        if (to - mid >1) {
            [self fastLineAry:ary from:mid+1 to:to];
        }
    }
}

-(void)paixuAry:(NSMutableArray *)ary
{
    if (ary.count>1) {
        [self fastLineAry:ary from:0 to:(int)ary.count -1];
    }
    NSLog(@"排序完成");
}

NSMutableArray *ary = [NSMutableArray arrayWithArray:@[@"4",@"19",@"15",@"1",@"2",@"0",@"7",@"15",@"17",@"16",@"10",@"18",@"3",@"5",@"14",@"6"]];
[self paixuAry:ary];

打印结果 :

2020-02-27 17:23:08.029797+0800  完成一轮比较:
6,14,5,3,10,4,15,1,2,0,7,15,17,16,18,19
2020-02-27 17:23:08.030298+0800  完成一轮比较:
0,2,1,3,4,15,7,6,14,5,10,15,17,16,18,19
2020-02-27 17:23:08.030608+0800  完成一轮比较:
1,0,2,3,4,15,7,6,14,5,10,15,17,16,18,19
2020-02-27 17:23:08.030887+0800  完成一轮比较:
0,1,2,3,4,15,7,6,14,5,10,15,17,16,18,19
2020-02-27 17:23:08.031192+0800  完成一轮比较:
0,1,2,3,4,5,6,14,10,15,7,15,17,16,18,19
2020-02-27 17:23:08.031591+0800  完成一轮比较:
0,1,2,3,4,5,6,7,10,15,14,15,17,16,18,19
2020-02-27 17:23:08.032156+0800  完成一轮比较:
0,1,2,3,4,5,6,7,10,14,15,15,17,16,18,19
2020-02-27 17:23:08.032940+0800  完成一轮比较:
0,1,2,3,4,5,6,7,10,14,15,15,16,18,19,17
2020-02-27 17:23:08.033656+0800  完成一轮比较:
0,1,2,3,4,5,6,7,10,14,15,15,16,17,18,19
2020-02-27 17:23:08.034149+0800  完成一轮比较:
0,1,2,3,4,5,6,7,10,14,15,15,16,17,18,19

第一遍写的代码就出了问题(第一遍写的是注释掉的那两行代码),基本功还是不够,
由于NSArray和NSMutableArray内只能存放NSObject及其子类对象,就存了一堆NSString
测试数组中有两个一样的元素@"15",ary[m]和ary[n]都为@"15"时,这两个指针指向的是一同一个常量,
所以removeObject会同时移除两个对象,导致后续计算下标和数组长度错误。
有时间还是要去复习一下基础知识

上一篇下一篇

猜你喜欢

热点阅读