美文网首页
iOS之【算法快排、堆排】

iOS之【算法快排、堆排】

作者: NJ_墨 | 来源:发表于2020-06-02 11:52 被阅读0次

快排序

把数组第一个当作基数,从右开始执行一趟排序得到
1.如果当前被选中的值小于基数
从左向右填充
2.如果当前被选中的值等于基数
不移动
3.如果当前被选中的值大于基数
从最右往左填充

- (NSArray *)quickSort:(NSArray *)sort {
    
    if (![sort isKindOfClass:[NSArray class]]) {
        return @[];
    }
    if (sort.count < 2) {
        return sort;
    }
    
    NSMutableArray *mutSort = [[NSMutableArray alloc] initWithArray:sort];
    
    NSMutableArray *leftArray = [[NSMutableArray alloc] init];
    NSMutableArray *rightArray = [[NSMutableArray alloc] init];
    
    if (sort.count > 3) {//长度大于3的数组值得使用随机锚点
        int midIndex = arc4random()%mutSort.count;
        //将随机找到的元素与位置为0的元素交换
        [mutSort exchangeObjectAtIndex:0 withObjectAtIndex:midIndex];
    }
    
    //设定锚点为位置0的元素,在这用固定位置的锚也是可行的,但易被特殊数据针对
    int mid = [mutSort[0] intValue];
    for (int i=1; i<mutSort.count; i++) {
        if ([mutSort[i] intValue] < mid) {
            //当元素小于锚点值 就把它推入左边
            [leftArray addObject:mutSort[i]];
        } else {
            //大于或等于锚点值的元素推入右边
            [rightArray addObject:mutSort[i]];
        }
    }
    
    NSMutableArray *resultArray = [[NSMutableArray alloc] init];

    //递归左右段,最后将所有锚点拼起来
    [resultArray addObjectsFromArray: [self quickSort:leftArray]];
    [resultArray addObject:mutSort[0]];
    [resultArray addObjectsFromArray: [self quickSort:rightArray]];

    return resultArray;
    
}

堆排序

堆通常是一个可以被看做一棵树的数组对象。
堆的时间复杂度O(N*logN),额外空间复杂度O(1),是一个不稳定的排序
堆的数据结构
大根堆:每个结点的值都大于其左孩子和右孩子结点的值
小根堆:每个结点的值都小于其左孩子和右孩子结点的值

- (void)heapSort:(NSMutableArray *)list
{
    
    list = [[NSMutableArray alloc] initWithObjects:@"50",@"10",@"90",@"30",@"70",@"40",@"80",@"60",@"20", nil];
    NSInteger i ,size;
    size = list.count;
    //找出最大的元素放到堆顶
    for (i= list.count/2-1; i>=0; i--) {
        [self createBiggesHeap:list withSize:size beIndex:i];
    }
    
    while(size > 0){
        [list exchangeObjectAtIndex:size-1 withObjectAtIndex:0]; //将根(最大) 与数组最末交换
        size -- ;//树大小减小
        [self createBiggesHeap:list withSize:size beIndex:0];
    }
    NSLog(@"堆排序:%@",list);
}

- (void)createBiggesHeap:(NSMutableArray *)list withSize:(NSInteger) size beIndex:(NSInteger)element
{
    NSInteger lchild = element *2 + 1,rchild = lchild+1; //左右子树
    while (rchild < size) { //子树均在范围内
        if ([list[element] integerValue] >= [list[lchild] integerValue] && [list[element] integerValue] >= [list[rchild]integerValue]) return; //如果比左右子树都大,完成整理
        if ([list[lchild] integerValue] > [list[rchild] integerValue]) { //如果左边最大
            [list exchangeObjectAtIndex:element withObjectAtIndex:lchild]; //把左面的提到上面
            element = lchild; //循环时整理子树
        }else{//否则右面最大
            [list exchangeObjectAtIndex:element withObjectAtIndex:rchild];
            element = rchild;
        }
        
        lchild = element * 2 +1;
        rchild = lchild + 1; //重新计算子树位置
    }
    //只有左子树且子树大于自己
    if (lchild < size && [list[lchild] integerValue] > [list[element] integerValue]) {
        [list exchangeObjectAtIndex:lchild withObjectAtIndex:element];
    }
}

相关文章

  • iOS之【算法快排、堆排】

    快排序 把数组第一个当作基数,从右开始执行一趟排序得到1.如果当前被选中的值小于基数从左向右填充2.如果当前被选中...

  • iOS算法之快排

    详细代码请参考Algorithm。参考代码比文字好理解。 快速排序(Quicksort)是对冒泡排序的一种改进。它...

  • all

    算法与数据结构 常见算法类型 排序算法(冒泡、插入、选择、快排、希尔、堆排、归并、桶排、基数、计数)、字符串操作、...

  • 【算法】排序(快排、堆排、归并)、查找

    快速排序 具体做法 首先选第一个待排序元素作为枢轴,根据枢轴将待排序列分为两个子列,这两个子列必须满足一下条件:一...

  • 冒泡 快排 堆排

    冒泡排序 原理:一遍循环与旁边的比较找到最大(最小)放到后面,多趟排序之后就成为一个有序的队列。 冒泡循环中有嵌套...

  • 常用排序算法

    常见排序算法 本文介绍6种常用排序算法,包括冒泡、选择、插入、快排、堆排、希尔排序。下面从排序算法的原理、解题步骤...

  • 排序算法一之快排、归并、堆排(swift 实现)

    1.快排 思想快排选取一个作为基准,把小的数放到基准数的左边,把大的数放到基准数的右边。再以基准数左边、右边分别进...

  • 排序算法

    快排 堆排 归并

  • iOSer必须了解的数据结构

    数据结构 :哈希表、堆、栈、队列、链表、二叉树 操作系统(iOS)的堆、栈 算法 :排序、冒泡、快排、二分查找 数...

  • Java基础算法:堆排,快排,二分查找

    Java基础算法:堆排,快排,二分查找 1. 堆排 满二叉树:所有叶结点都有同样的深度,每个内部结点都有两个儿子 ...

网友评论

      本文标题:iOS之【算法快排、堆排】

      本文链接:https://www.haomeiwen.com/subject/ohquzhtx.html