美文网首页
OC中的排序算法

OC中的排序算法

作者: Double_Chen | 来源:发表于2017-03-02 16:50 被阅读26次

目录

冒泡排序、快速排序、选择排序、插入排序
    NSMutableArray *arr = [NSMutableArray array];
    for (int i = 0; i < 10; i++) {
        [arr addObject:@(arc4random() % 10)];
    }

冒泡

//冒泡排序
/*
 第i个元素和第i+1个元素比较,如果左边大于右边,进行交换
 */
- (void)maopao:(NSMutableArray *)arr {
    for (int i = 0; i < arr.count - 1; i++) {   //因为是两两比较,执行n-1次就可以判断到全部元素
        for (int j = 0; j < arr.count - 1 - i; j++) {
            NSInteger this = [arr[j] integerValue];
            NSInteger next = [arr[j+1] integerValue];
            if (this > next) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
}

快排

//快速排序
/*
 代码参考链接:http://developer.51cto.com/art/201403/430986.htm
 视频链接:http://www.iqiyi.com/v_19rrhzyeqs.html    有动画讲解,生动形象
 
 描述:
 取一个基准数,从右边开始算找到一个大于等于它的值,记录指针,及该元素索引,
 接着从左边开始算找到一个小于等于它的值,记录指针,
 当两个指针不重合的时候交换这两个位置对应的元素,进行了一次排序,
 直到两个指针重合时,重合位置的值必定小于等于基准数,因为是从右边开始算,将指针对应的值填入基准数原来位置,基准数填入指针对应位置,这样就完成了一次排序
 接着递归指针为中心的两个区间,完成排序
 */
- (void)kuaisu:(NSMutableArray *)arr {
    [self quickSort:arr left:0 right:(int)arr.count-1];
}

- (void)quickSort:(NSMutableArray *)arr left:(NSInteger)left right:(NSInteger)right {
    NSInteger i,j,temp;  //声明左右指针,基准数
    if (left > right) return;
    
    temp = [arr[left] integerValue];    //取第一个元素做基准数
    
    i = left;   //指针分别从最左和最右开始
    j = right;
    
    while (i != j) {    //指针碰撞结束循环
        //先从右边开始(为什么从右边开始,参考:http://blog.csdn.net/w282529350/article/details/50982650)
        while ([arr[j] integerValue] >= temp && i < j) { //快速排序是不稳定排序,所以加=
            j--;
        }
        //再从左边开始
        while ([arr[i] integerValue] <= temp && i < j) {
            i++;
        }
        //指针不同时交换对应元素在数组中的位置
        if (i < j) {
            [arr exchangeObjectAtIndex:i withObjectAtIndex:j];
        }
    }
    
    //将指针碰撞对应的元素填入基准数原来的位置,将基准数填入指针碰撞的索引位置
    [arr replaceObjectAtIndex:left withObject:arr[i]];
    [arr replaceObjectAtIndex:i withObject:@(temp)];
    
    //将两边区间进行递归操作
    [self quickSort:arr left:left right:i-1];
    [self quickSort:arr left:i+1 right:right];
}

选择

//选择排序
/*
 取出数组中的最小值,放到数组的第一个位置,
 从i=0开始,因为前面i个元素已经排好序,所以每取一个值就跳过数组前i个元素,直到最后一个元素不用判断就可以知道是最大值
 */
- (void)xuanzhe:(NSMutableArray *)arr {

    NSInteger index = 0;    //标记索引,从第一个开始
    
    for (int i = 0; i < arr.count - 1; i++) {   //最后一个元素不用比较就知道是最大,所以-1

        NSInteger min = [arr[i] integerValue];  //取第一个元素暂定为最小值
        for (int j = i + 1; j < arr.count; j++) {   //拿第一个数比较第二个数,所以+1,防止arr[j]比较arr[j]
            NSInteger num = [arr[j] integerValue];
            if (num <= min) {   //这里加=号,是关于不稳定排序的处理http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html
                min = num;
                index = j;
            }
        }
        [arr exchangeObjectAtIndex:index withObjectAtIndex:i];
    }
}

插入

//插入排序
/*
 从第二个数开始取出,与前面已排序的元素进行比较。因为待排元素被取出,此时空了一个位置
 当前一位元素大于待排元素,把前一位元素向后移一位,即填到待排元素被取出的位置,此时该元素被移动,再次空了一个位置
 直到前一位元素小于待排元素时,前一位元素不变,待排元素插入到空出的位置
 重复以上操作直到最后一个元素
 要注意的是待排元素是与前一位元素开始比较,比较方向为右边到左边
 */
- (void)charu:(NSMutableArray *)arr {
    for (int i = 1; i < arr.count; i++) {
        NSInteger indexNum = [arr[i] integerValue];   //从第二个数开始,与前面已排序的元素比较

        int j = i - 1;  //前面已排序的元素个数
        while (j >=0 && [arr[j] integerValue] > indexNum) { //前面的元素大于待排元素时
            [arr replaceObjectAtIndex:j+1 withObject:arr[j]];   //将前一个元素移到后面以一位
            j--;
        }
        [arr replaceObjectAtIndex:j+1 withObject:@(indexNum)];  //判断到前面的元素小于待排元素时,插入
    }
}

相关文章

  • iOS排序方法集合

    OC_选择排序 OC_冒泡排序 参考原文:排序算法

  • 常见算法

    OC整理递归和排序算法

  • OC中的排序算法

    目录 冒泡排序、快速排序、选择排序、插入排序 冒泡 快排 选择 插入

  • 算法:冒泡排序

    本文内容:1、什么是冒泡排序?2、冒泡排序的 C/OC 实现与算法分析。 算法总目录:算法? 1、什么是冒泡排序?...

  • OC 中实现常用的算法

    #在OC中实现常用的算法(冒泡,选择,快速,插入) ## 1.冒泡排序 - (void)viewDidLoad {...

  • 面试资料

    TCP/UDP协议稳定与不稳定排序OC中的load和initialize方法八大排序算法图解iOS的MVC结构深入...

  • 算法

    冒泡排序、选择排序 swift 写法 OC 写法 斐波那契算法【后一项等于前两项之和】

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 2022-03-01

    1.排序算法: 到底什么是排序?-它是排列列表中项目顺序的算法。 重要的排序算法—— 冒泡排序:冒泡排序是最基本的...

  • 排序算法

    一、排序算法总结 排序算法题目 排序算法快速排序堆排序归并排序 应用最小K个数(TopK问题)215.数组中的第K...

网友评论

      本文标题:OC中的排序算法

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