OC实现十大排序算法

165 阅读1分钟

先列下代码,算法的实现细节可以参考网上,这里只提供可运行、调试的代码。

#define Tick NSDate *startTime = [NSDate date];
#define Tock NSLog(@"Time: %f",-[startTime timeIntervalSinceNow]);

@property (nonatomic, strong) NSMutableArray *ArrayM;
self.ArrayM = [NSMutableArray array];
    for (int i = 0; i<= 10; i++) {
        [self.ArrayM addObject:@(arc4random()%50)];
    }

冒泡排序

- (void)method1 {
    Tick
    //冒泡,循环两层遍历
    //    1.将最大的数字排到最后
    for (int i = 0; i<self.ArrayM.count - 1; i++) {
//.i从0开始排序,到数组倒数第二位(为什么到倒数第二位呢?因为冒泡本质是交换,当排到倒数第二位的时候,已经是和最后一位做交换了,所以就可以停止循环了)
        for (int j = 0; j<self.ArrayM.count-1-i; j++) {
//.j从0开始,而且每次都是从0开始,冒泡每次都会挑选出最大或者最小,排到最后面。所以内层循环的次数逐次递减
            if ([self.ArrayM[j] intValue] > [self.ArrayM[j + 1] intValue]) {
//.当前位置与后面一个位置最比较(所以要考虑到数组越界的问题,j的范围)
                NSNumber *temp = self.ArrayM[j];
                self.ArrayM[j] = self.ArrayM[j + 1];
                self.ArrayM[j + 1] = temp;
            }
        }
    }
    Tock
}

选择排序

- (void)method2 {
    Tick
    for (int i = 0; i < self.ArrayM.count - 1; i ++) {
        //i从0开始,还是循环到数组的倒数二位,本质还是交换,先比较之后,再做交换,最后一个没有可以比较的,所以不用循环了
        int min = i;
        for (int j = i; j < self.ArrayM.count - 1; j ++) {
           //.内层循环 j 从i开始的位置开始,选择排序是把有序的排到前面
            //.
            if ([self.ArrayM[min] intValue] > [self.ArrayM[j + 1] intValue]) {
                min = j + 1;
            }
        }
        NSNumber *temp = self.ArrayM[i];
        self.ArrayM[i] = self.ArrayM[min];
        self.ArrayM[min] = temp;
    }
    //
    Tock
}

插入排序

- (void)method4 {
    Tick
    for (int i = 1; i < self.ArrayM.count; i++) {
        NSNumber *insertNum = self.ArrayM[i];
        int j = i - 1;
        for (;j>=0 &&insertNum.intValue < [self.ArrayM[j] intValue]; j--) {
            self.ArrayM[j + 1] = self.ArrayM[j];
        }
        self.ArrayM[j + 1] = insertNum;
    }
    Tock
}