算法实战---OC快速排序(一)

我是乔帮主 2018-01-29 14:14:43 ⋅ 903 阅读

** 近来在巩固数据结构和算法的知识, 动动手操作操作. **

能讲出来是真的懂了, 分享是件快乐的事

第一. 先来一张算法的时间复杂度/空间复杂度以及使用场景

网上下载的图片

网上有一个排序算法的动画演示,非常有趣。大家可以参考一下;

第二. 那些专有名词的计算方法

时间复杂度定义

在进行算法分析时, 语句总的执行次数T(n)是关于问题规模n的函数, 进而分析 T(n) 随 n 的数量级.
记作: T(n) = O(f(n)), 表示随问题规模 n 的增大, 算法执行时间的增长率和 f(n) 的增长率相同, 成为算法的渐进时间复杂度

计算方法

1. 用<常数 1 >取代运行时间中的所有<加法常数>;
2. 在修改后的运行次数函数中只保留<最高阶项>;
3. 如果最高阶项存在且不是 1, 则取出与这个项相乘的常数.

如: 计算函数的时间

for (int i = 0, i < n, i++){    for (int j = i, j < n, j++){        //时间复杂度为 O(1)的方法
    }
}

等于多少呢? 答案是 O(n²), 觉得函数中的第二个for 循环不是 < n, 对吧?

按照上面的规则:

总的执行次数: 

n + (n - 1) + (n - 2) + .... + 1 = n(n + 1) / 2 = n²/2 + n/2上边的求解方法:1. 没有加法常数不予考虑 ===> n²/2 + n/2;2. 只保留最高阶 ===> n²/2;3. 去掉这个项目相乘的常数(1/2) ===> n²;4. 最终为O(n²);

总的时间复杂度为: n * n => O(n²)

明白了吧

第三. 本文的主题: 快速排序

快速排序是 C.R.A.Hoare 于 1962 年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

分治法的基本思想

1. 将原问题分解为若干个规模更小但结构与原问题相似的子问题;
2. 递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

快速排序的整体思想

1. 每次一个基准点<pivot>,
2. 将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
3. 重复1 2.

快速排序的动画演示:

1170656-aa523ec3ba9a2909.gif

参考<啊哈算法>这本书, 整理自己的理解;

1.待排序数组

待排序

  1. 左右开工

Paste_Image.png

从右向左, 从左向右依次执行, 如下图所示

Paste_Image.png

用标准的OC代码来实现一下

- (void)quickSortWithArray:(NSMutableArray *)array left:(NSInteger)left right:(NSInteger)right{    //数组不需要排序
    if (left >= right) return;    
    //数组第一个位置
    NSInteger i = left;    //数组最后一个位置
    NSInteger j = right;    //将第一个位置的<value>作为---基准
    NSInteger pivot = [array[left] integerValue];    
    while (i != j) {        //从后往前走, 直到找到 大于 <基准> 的数字, 此时 j 保存那个数字的下标位置
        while (i < j && pivot <= [array[j] integerValue]) {
            j--;
        }        //再从前往后走, 直到找到 小于 <基准> 的数字, 此时 i 保存那个数字的下标位置
        while (i < j && pivot >= [array[i] integerValue]) {
            i++;
        }        //互换位置
        if (i < j) {
            [array exchangeObjectAtIndex:i withObjectAtIndex:j];
        }
        
    }    //最终将基准数归位, 因为i == j, 需要将<基数所在位置的value>与<i/j相等的位置的value>互换位置
    [array exchangeObjectAtIndex:i withObjectAtIndex:left];    //继续左边的排序
    [self quickSortWithArray:array withLeft:left andRight:i - 1];    //继续右边的排序
    [self quickSortWithArray:array withLeft:i + 1 andRight:right];
}

**Demo也有的, 请看Github, Demo都会加上不少的注释滴 **

多动手, 多思考, 多写多画,
可能每种语言都有类似的API, OC中有 exchangeObjectAtIndex .. withObjectAtIndex 的 -_-

更多精彩内容请关注“IT实战联盟”哦~~~



全部评论: 0

    我有话说:

    算法实战---OC希尔排序(二)

    我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。---- 希尔(shell排序作者)

    排序 --- 归并排序

    此篇文章引自 这里,个人感觉无出其右者,只好借鉴而来 归并排序 是递归分治和有序合并的简称, 首先利用分治法的思想将序列递归分裂成若干个子序列,使将子序列基本有序,最后使整体有序。 、图示

    京东技术:面对海量流量七步走保证用户体验(部分操作能够快速实战

    当促销活动正式开始时,不少用户开启了价格保护,在此高并发情况下,如何保证用户体验,如何保证系统的稳定性、高可用、快速计算结果,是本文的重点。

    iOS实战篇:[译]iOS扩充--OCR光学字符识别(内附项目GitHub地址)

    OCR(Optical Character Recognition) 光学字符识别, 是从图像中电子扫描提取文本的过程, 可以在文档编辑等多种形式重用它,例如: 文本搜索/压缩等用途。

    Docker - 大数据环境快速搭建步骤

    快速搭建一个大数据的环境,我们可以使用Docker来实现,文章会演示如何使用。

    运用Docker快速部署分布式项目

    快速搭建Docker分布式项目环境

    SpringBoot+zk+dubbo架构实践):本地部署zookeeper

    SpringBoot+zk+dubbo架构实践系列实现目标:自己动手搭建微服务架构

    SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台

    本系列架构实践不做深入探讨,主旨是带领大家能够快速踏入微服务架构门槛,能够轻松的搭建套属于自己的微服务架构。——写代码我们是认真滴!

    架构实战篇(十):Spring Boot 集成企业级搜索引擎 SolrCloud

    Solr是以Lucene为基础实现的文本检索应用服务。Solr部署方式有单机方式、多机Master-Slaver方式、Cloud方式。

    Chrome OS 88 自定义屏保界面,可指纹登录第三方网站

    上周 Google 推出了 Chrome 88,在周之后,Google 正式向 Chromebook 用户推送 Chrome OS 88,这也是 2021 年首个大版本更新。这个版本加入了多项新

    MySql实战篇:正确理解并使用MySql索引

    索引是存储引擎用于快速查找记录的种数据结构,通过合理的使用数据库索引可以大大提高系统......

    TestableMock v0.6.0 发布,新增测试参数快速构造工具

    项目介绍 TestableMock是款由阿里效能团队开源的Java单元测试增强工具,提供四项具有针对性的辅助能力: 快速Mock任意调用:解决传统Mock工具使用繁琐的问题 访问被测类私有成员

    Spring Initializr 0.1.0 发布,Spring 项目的快速开始生成器

    Spring Initializr 0.1.0 已经发布。 Spring initializr 是一个 Spring 项目的快速开始生成器。其提供了一个可扩展的 API 来生成基于 JVM

    Redis为什么变慢了?Redis性能问题排查详述

    Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例OPS 能够达到 10W 左右。但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符。 你

    架构实战篇:MyBatis一级、二级,并整合ehcache分布式缓存的使用,附演示实例

    ehcache是一个纯Java的进程内缓存框架,是种广泛使用的开源Java分布式缓存,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

    架构实战篇(七):Spring Boot Data JPA 快速入门

    Spring Data JPA 是Spring Data 的一个子项目,它通过提供基于JPA的Repository极大了减少了操作JPA的代码。

    微信小程序微商城():https框架搭建并实现导航功能

    本文将带领大家搭建https的小程序框架,并实现动态获取数据展示效果!