20140929个人日志(类方法与实例方法,堆排序)

      今天做项目时编写了一个类,在类方法里调用实例方法(静态方法)时,我用 self 去调用,结果出错,但是实例化一个对象,用此对象去调用实例方法时就没有问题。查资料才知道:

实例方法里的 self 是对象的首地址,而类方法里的 self 是类的首地址,尽管在同一个类中使用,但是两者的含义不同。以下内容是摘抄网文的,地址不记得了,原谅不能注明转载出处

iOS编程——类方法 和self

Objective-C里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。
注意点一:类方法
1,类方法可以调用类方法。
2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思)。
注意点二:self的规则
大家需要记住下面的规则:
1,实例方法里面的self,是对象的首地址。
2,类方法里面的self,是Class.
尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。

以上是今天学习到的第一个内容,接前一天所提到的 xcode 菜单里 Product -->Analyze 的使用,此工具不能在设备为模拟器的时候起作用,必须要选择 IOS devise 才会起作用。这一工具对解决潜在的内存泄漏问题有很大的帮助。

项目上,在步行路线请求返回数据时,添加了错误处理机制。

下午编写堆排序代码,堆排序的基本思想就是,先对待排数据进行建堆处理,将所有的数据组成一个“大顶堆”,然后由于是大顶堆,所以最大元素必定在堆顶,也就是处于第一个位置,将第一个元素和最后一个元素进行交换,则原排序数据个数减1,剩下的数据除了堆顶不满足“大顶堆”定义外,其他结点都符合“大顶堆”定义,只需对根结点进行处理,得到新的大顶堆,重复这一过程继续对其它数据排序。具体的可以参考以下代码:

<pre name="code" class="objc"><span style="color:#3366ff;">// 堆排序

// 返回左孩子位置
int left(int index){
    return 2*(index+1)-1;   // 适应下标为0的需求
}
// 返回右孩子位置
int right(int index){
    return 2*(index+1);     // 适应下标为0的需求
}

/*!
 函数功能:将以指标 index 为根的子树建成最大堆
 参数说明:
 a[]            待排数组
 index          指标数,以index为根
 heapSize       堆的大小,也就是数组 a 所能容纳的最大下标
 算法时间复杂度:   O(lgn)
 */
void MaxHeapify(int a[],int index,int heapSize)
{
    if ( (a == NULL)||(index<0)||(index >= heapSize) ) {
        return;
    }
    int leftIndex  = left(index);
    int rightIndex = right(index);
    int largestIndex = -1;
    if ((leftIndex <= heapSize) && (a[index] < a[leftIndex]))
    {
        largestIndex = leftIndex;
    }
    else
        largestIndex = index;
    
    if ((rightIndex <= heapSize) && (a[largestIndex] < a[rightIndex]))
    {
        largestIndex = rightIndex;
    }
    
    if (largestIndex != index) {
        int temp = a[index];
        a[index] = a[largestIndex];
        a[largestIndex] = temp;
        MaxHeapify(a, largestIndex, heapSize);
    }
}

/*!
 函数功能:
    将待排数组按顺序建立一个大顶堆
 从最后一个非叶子结点(也就是最后一个叶子节点的父节点)开始
 注意到,下标从0开始,故而最后一个非叶子节点也不是 length/2 的向下取整了
 参数说明:
      a[]       待排数组
   length       待排数组元素个数
 算法时间复杂度:   线性时间内完成
 */

void CreateMaxHeap(int a[],int length)
{
    for (int i = (length/2 -1) ; i >= 0; i--)
    {
        MaxHeapify(a, i, length-1);
    }
}

/*!
 堆排序主体程序,将数组按升序排列
 算法思想:
    通过函数 CreateMaxHeap 将待排数组建立起大顶堆,所以最大元素处于堆顶.
 只需将堆顶元素和最后一个元素互换,则待排数组 a[0..n] 变成 a[0..n-1],
 但是,新的根元素不满足大顶堆要求(其余结点都满足),只需调用方法MaxHeapify(a, 0, heapSize);
 即可完成对新的根元素建立新的大顶堆,每次让 heapSize 减 1(最后一个元素完成排序,被析出)
 重复以上过程即可完成排序.
 函数名:  
    “堆排序”
 函数功能:
    对给定数组用堆排序方法按升序排列
 参数说明:
    a[]         待排数组
  length        待排数组元素个数
 算法时间复杂度:   O(nlgn)
 */

void HeapSort(int a[], int length)
{
    int heapSize = length - 1;
    
    CreateMaxHeap(a, length);
    
    for (int i = length-1; i > 0; i--)
    {
        int temp = a[0];
        a[0] = a[i];
        a[i] = temp;
        heapSize = heapSize - 1;
        MaxHeapify(a, 0, heapSize);
    }
}</span>


 
 main 函数里只需调用 HeapSort 函数即可 
 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值