十大排序算法-排序

 

- (int)cmp:(NSArray *)array idx:(int)idx idx1:(int)idx1{

    return [array[idx] intValue] - [array[idx1] intValue];

}

- (void)swap:(NSMutableArray *)array idx:(int)idx idx1:(int)idx1 {

    NSNumber *temp = array[idx];

    array[idx] = array[idx1];

    array[idx1] = temp;

}

 

- (void)siftDownArray:(NSMutableArray *)array

                index:(int)index

             heapSize:(int)heapSize{

        NSNumber *element = array[index];

 

        int half = heapSize >> 1;

        while (index < half) { // index必须是非叶子节点

            // 默认是左边跟父节点比

            int childIndex = (index << 1) + 1;

            NSNumber *child = array[childIndex];

 

            int rightIndex = childIndex + 1;

            // 右子节点比左子节点大

            if (rightIndex < heapSize && [self cmp:array idx:rightIndex idx1:childIndex] >0) {

                child = array[childIndex = rightIndex];

            }

 

            // 大于等于子节点

            if ([self cmp:array idx:index idx1:childIndex] >= 0) break;

 

            array[index] = child;

            index = childIndex;

        }

        array[index] = element;

}

1. 冒泡排序n2

- (void)bubupsort {

    NSMutableArray *array = [NSMutableArray array];

    [array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];

    for (int end = (int)array.count - 1; end > 0 ;end --) {

        for (int begin = 1; begin <= end ; begin++) {

            if ([self cmp:array idx:begin idx1:begin-1] < 0) {

                [self swap:array idx:begin idx1:begin-1];

            }

        }

    }

    NSLog(@"%@",array);

}

 2.选择排序n2,选择排序交换次数远远小于冒泡排序

- (void)selectSort {

    NSMutableArray *array = [NSMutableArray array];

    [array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];

    for (int end = (int)array.count - 1; end > 0 ;end --) {

        int max = 0;

        for (int begin = 1; begin <= end ; begin++) {

            if ([self cmp:array idx:max idx1:begin] < 0) {

                max = begin;

            }

        }

        [self swap:array idx:max idx1:end];

    }

    NSLog(@"%@",array);

}

堆排序 logn 可以看做选择排序的优化

 - (void)heapSort{

    NSMutableArray *array = [NSMutableArray array];

    [array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];

      

    // 原地建堆

    int heapSize = (int)array.count;

    for (int i = (heapSize >> 1) - 1; i >= 0; i--) {

        [self siftDownArray:array index:i heapSize:heapSize];

    }

            

    while (heapSize > 1) {

        // 交换堆顶元素和尾部元素

        [self swap:array idx:0 idx1:--heapSize];

        // 对0位置进行siftDown(恢复堆的性质)

        [self siftDownArray:array index:0 heapSize:heapSize];

    }

    NSLog(@"%@",array);

}

 

- (void)insertSort {

    NSMutableArray *array = [NSMutableArray array];

    [array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];

    for(int begin = 1; begin<array.count; begin++) {

        int cur = begin;

        while (cur > 0 && [self cmp:array idx:cur idx1:cur-1]<0) {

            [self swap:array idx:cur idx1:cur-1];

            cur--;

        }

    }

    NSLog(@"%@",array);

}

posted @ 2021-06-02 15:10  syh-918  阅读(51)  评论(0)    收藏  举报