算法篇学习笔记 (一)

497 阅读1分钟

算法篇学习笔记

时间复杂度&空间复杂度

算法的优劣主要从【时间】和【空间】两个维度来考量。

  • 时间维度:执行当前算法消耗的时间,常用时间复杂度来描述

  • 空间维度:执行当前算法需要占用的内存空间,常用空间复杂度来描述

空间复杂度

算法的稳定性

如果相等的2个元素,在排序前后的相对位置保持不变,那么就叫稳定的排序算法。

// 伪代码
// 排序前
[1,3(a),5,3(b)]

// 排序后 (稳定排序)
[1,3(a),3(b),5]

// 不稳定
[1,3(b),3(a),5]

在写算法过程中,稳定的算法也能写成不稳定算法:

/// 普通冒泡排序算法
- (void)bubleSort1 {
    for (NSInteger end = self.bubbleSortArray1.count-1; end > 0; end--) {
        for (NSInteger begin = 1; begin<=end; begin++) {
            NSInteger a = [self.bubbleSortArray1[begin] integerValue];
            NSInteger b = [self.bubbleSortArray1[begin-1] integerValue];
          // (a <= b) 为不稳定排序	
          // (a < b) 为稳定排序
            if (a < b) {
                [self.bubbleSortArray1 exchangeObjectAtIndex:begin-1 withObjectAtIndex:begin];
            }
        }
    }
}

原地算法

不依赖额外资源,或依靠少量的额外资源,仅靠输入来覆盖输出的为原地算法。

空间复杂度O(1)的都可以认为是原地算法。

冒泡排序

冒泡排序:

/// 普通冒泡排序算法
- (void)bubleSort1 {
    for (NSInteger end = self.bubbleSortArray1.count-1; end > 0; end--) {
        for (NSInteger begin = 1; begin<=end; begin++) {
            NSInteger a = [self.bubbleSortArray1[begin] integerValue];
            NSInteger b = [self.bubbleSortArray1[begin-1] integerValue];
            if (a < b) {
                [self.bubbleSortArray1 exchangeObjectAtIndex:begin-1 withObjectAtIndex:begin];
            }
        }
    }
}

优化冒泡排序1:

/// 优化冒泡排序1
/// 在数组有序或部分有序的情况下不交换有序部分
/// 这部分优化,在部分有序的情况下耗时小于 bubleSort1
/// 在数组乱序时耗时大于bubleSort1
- (void)bubleSort2 {
    NSLog(@"======排序前=======");
    NSLog(@"bubbleSortArray1=%@",self.bubbleSortArray1);
    for (NSInteger end = self.bubbleSortArray1.count-1; end > 0; end--) {
        BOOL sorted = YES;
        for (NSInteger begin = 1; begin<=end; begin++) {
            NSInteger a = [self.bubbleSortArray1[begin] integerValue];
            NSInteger b = [self.bubbleSortArray1[begin-1] integerValue];
            if (a < b) {
                sorted = NO;
                [self.bubbleSortArray1 exchangeObjectAtIndex:begin-1 withObjectAtIndex:begin];
            }
        }
        if (sorted) {
            break;
        }
    }
    NSLog(@"======排序后======");
    NSLog(@"bubbleSortArray1=%@",self.bubbleSortArray1);
}

冒泡排序优化2:

/// 提前找到部分有序的部分 减少比较次数 可更一步优化 bubleSort2
/// 最好的时间复杂度 O(n)
/// 最坏时间复杂度 O(n2)
- (void)bubleSort3 {
    NSLog(@"======排序前=======");
    NSLog(@"bubbleSortArray1=%@",self.bubbleSortArray1);
    for (NSInteger end = self.bubbleSortArray1.count-1; end > 0; end--) {
        NSInteger sortedIndex = 1;
        for (NSInteger begin = 1; begin<=end; begin++) {
            NSInteger a = [self.bubbleSortArray1[begin] integerValue];
            NSInteger b = [self.bubbleSortArray1[begin-1] integerValue];
            if (a < b) {
                [self.bubbleSortArray1 exchangeObjectAtIndex:begin-1 withObjectAtIndex:begin];
                sortedIndex = begin;
            }
        }
        end = sortedIndex;
    }
    NSLog(@"======排序后======");
    NSLog(@"bubbleSortArray1=%@",self.bubbleSortArray1);
}