插入排序
- 直接插入排序
假设待排序的数据存放在R[0…..n-1],排序过程的某一中间时刻,R被划分成两个子区间R[0…i-1]和R[i…n-1],其中,前一个子区间是已排好序的有序区;后一个子区间则是当前未排序的部分,。直接插入排序的基本操作是将当前无序区的i号元素R[i]插入到有序区R[0…i-1]中适当位置上;(时间复杂度O(n^2),稳定排序)
从心所愿
1、所有OC对象所占的内存总是分配在“堆空间”(heap space)中,而绝不会分配在“栈”中,不能在栈中分配OC对象,这点与C++不同:
NSString stackString; //错误,不能在栈空间分配对象;
2、使用类的向前声明(forward declaring)可以节省编译时间,也解决了两个类头文件相互引用的问题;
eg:如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,使用#import而非include指令虽然不会导致死循环,但却意味着两个类里有一个无法被正确编译;如果使用@class在两个类的头文件中相互声明,则不会有问题。
3、OC所有的collection拷贝都是浅拷贝,因为collection中也许会有不支持NSCopying的自定义类;
4、ARC只负责管理Objective-C对象的内存,尤其要注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CGRelease;
5、实现缓存时应选用NSCache而非NSDictionary对象。因为NSCache可以提供优雅的自动删减功能,而且是线程安全的,此外,它与字典不同,并不会拷贝键;
6、计时器会保留其目标对象,等到自身“失效”后再释放此对象;调用invalidate方法可令计时器失效;执行完相关任务后,一次性的计时器也会失效。
注意:开发者若将计时器设置为重复执行模式,那么必须自己调用invalidate方法,才能令其停止;