IOS 中常用的排序算法

@implementation Sort

// 冒泡排序
// 依次两两相比,大的挪后边
+ (NSMutableArray *)bubbleSort:(NSArray *)array {
    
    NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
    for (int end = (int)marray.count - 1; end > 0 ; end--) {
        for (int begin = 0; begin < end; begin++) {
            if (marray[begin] < marray[begin+1]) {
                [marray exchangeObjectAtIndex:begin withObjectAtIndex:begin+1];
            }
        }
    }
    return marray;
}

// 选择排序
// 从序列中找到最大的元素,然后和最末尾的元素交换
+ (NSMutableArray *)selectionSort:(NSArray *)array {
    NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
    for (int end =  (int)(marray.count)-1; end>0; end--) {
        NSInteger maxIndex = 0;
        for (int begin = 1; begin <= end; begin++) {
            if (marray[maxIndex] < marray[begin]) {
                maxIndex = begin;
            }
        }
        [marray exchangeObjectAtIndex:maxIndex withObjectAtIndex:end];
    }
    return marray;
}
// 插入排序
// 每次选择排好序的后一个数据与前边排好序的每一个进行比较
+ (NSMutableArray *)insterSort:(NSArray *)array {
    NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
    for (int begin = 1; begin <= marray.count; begin++) {
        int end = begin-1;
        while (end>0) {
            if ([marray[end] integerValue] < [marray[end-1] integerValue]) {
                [marray exchangeObjectAtIndex:end withObjectAtIndex:end-1];
            }
            end--;
        }
    }
    return marray;
}

+ (NSMutableArray *)quickSort:(NSArray *)array {
    NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
    
    return marray;
}
// 二叉堆排序
+ (NSMutableArray *)heapSort:(NSArray *)array {
    NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
    int heapSize = (int)marray.count;
    // 原地建堆
    for (int i = (heapSize >> 1) - 1; i >= 0; i--) {
        [Sort siftDown:i array:marray heapSize:heapSize];
    }
    // 此时,第一个元素是最大的.
    while (heapSize > 1) {
        // 交换第0 个元素 和 最后一个元素 最大的元素去到末尾
        [marray exchangeObjectAtIndex:0 withObjectAtIndex:--heapSize];
                
        [Sort siftDown:0 array:marray heapSize:heapSize];

    }
    return marray;
}
// 下虑 恢复二叉堆的性质 (这里用的是大顶堆)
+ (void)siftDown:(int)index array:(NSMutableArray *)array heapSize:(int)heapSize{
    
    NSInteger element = [array[index] integerValue];
    // 第一个叶子结点的索引
    int half = heapSize >> 1;
    while (index < half){
        // 默认先取左子节点
        int childIndex = (index << 1) + 1;
        NSInteger child = [array[childIndex] integerValue];
        // 右子节点
        int rightIndex = childIndex+1;
        // 右边比较大
        if ((NSInteger)array[rightIndex] - child > 0){
            childIndex = rightIndex;
            child = (NSInteger)array[rightIndex];
        }

        // 节点比左右节点都大,跳出循环
        if ((element - child) >= 0 ) break;
        // 否则, 子节点上去
        array[index] = @(child);
        // 记录要替换的位置
        index = childIndex;
    }
    array[index] = @(element);
}
@end

 

posted @ 2021-10-28 17:13  在路上de 小白  阅读(190)  评论(0编辑  收藏  举报