算法篇学习笔记
时间复杂度&空间复杂度
算法的优劣主要从【时间】和【空间】两个维度来考量。
-
时间维度:执行当前算法消耗的时间,常用时间复杂度来描述
-
空间维度:执行当前算法需要占用的内存空间,常用空间复杂度来描述
空间复杂度
算法的稳定性
如果相等的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);
}