Flutter Dart快速排序算法示例详解
目录
- 引言
- 快速排序算法
- 分治法(Divide and conquer)
- 快速排序算法实现
引言
在日常研发的过程中,我们无时无刻都在考虑自己开发的程序是否高效,一段好的程序执行离不开对算法的深刻认识和熟练掌握。接下来的日子,我将带着大家一起重温一下常见的几种算法。
先上大图:
下面我们一起来学习一下 快速排序算法 吧!
快速排序算法
维基百科介绍: 快速排序使用分治法(Divide and conquer)策略來把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列,最终合并得到一个从小到大的序列。
有聪明的小伙伴就会问了:什么是分治法策略呢?
分治法(Divide and conquer)
字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
由此就可以引出我们今天讲的快速排序算法的实现步骤了:
- 从数据中随机获取一个值,按这个值的大小对比分成左右两个数据集合,左边数据集合的值小于此值,右边反之
- 将两边数据进行递归调用步骤1
- 将所有数据合并
快速排序算法实现
void main() { List<int> quickSort(List<int> arr) { // 处理边界问题 if (arr.length <= 1) { return arr; } // 取出第一个值作为参考 int splitData = arr[0]; // 小于参考值的集合 List<int> low = []; // 大于参考值的集合 List<int> hight = []; // 与参考相等的集合 List<int> mid = []; // 初次把参考值添加到mid中 mid.add(splitData); for (int i = 1; i < arr.length; i++) { if (arr[i] < splitData) { // 小于 low.add(arr[i]); } else if (arr[i] > splitData) { // 大于 hight.add(arr[i]); } else { // 等于 mid.add(arr[i]); } } // 二分数据后,再继续递归整理 low = quickSort(low); hight = quickSort(hight); // 最后合并 return [...low, ...mid, ...hight]; } const List<int> ary = [4, 5, 1, 3, 6, 2, 5, 6, 7, 2, 4]; print(quickSort(ary)); }
至此,我们就重新温习了一下 快排算法 !
更多关于Flutter Dart快速排序算法的资料请关注我们其它相关文章!
相关推荐
-
SafeList in Flutter and Dart小技巧
目录 正文 封装一个SafeList 测试一下 正文 最近遇到一些列表的错误,例如,列表为空时直接调用方法会报错. 一般都会在使用前判断列表是否为空,再使用. 虽然Flutter提供了Null safety,但是用的时候还是会忘记或者忽略,直接使用'!'来跳过非空判断. 封装一个SafeList 代码如下: class SafeList<T> extends ListBase<T> { final List<T> _list; final T defaultValue;
-
Dart多个future队列完成加入顺序关系及原子性论证
目录 引言 什么是 Future Future 操作具备'原子性'吗 实验写法一: 实验写法二: 实验写法三: 论证结论 引言 Dart 是一个在单线程中运行的程序.在程序中执行一个需要长时间的执行的操作,为避免卡住UI主线程,我们会用到异步(future),可以使程序在等待一个耗时操作完成时继续处理其他工作. 在进入正题之前,我们先了解一下 Dart 的消息循环机制: Dart 从两个队列执行任务:Event事件队列 和 Microtask微任务队列 事件循环会优先处理微任务队列,microt
-
一文详解Dart如何实现多任务并行
目录 Isolate(隔离区域) async/await Stream Compute Function Isolate(隔离区域) Dart 是一种支持多任务并行的编程语言,它提供了多种机制来实现并发和并行.下面是 Dart 实现多任务并行的几种方式: Dart 中的 Isolate 是一种轻量级的并发机制,类似于线程.每个隔离区域都是独立的内存空间,每个隔离区域都有自己的内存空间和执行线程,因此不同的隔离区域之间可以独立地执行代码,每个隔离区都在自己的核心上运行,不会阻塞其他 Isolate
-
Dart语法之变量声明与数据类型实例详解
目录 前言 1.安装与使用 1.1 安装 1.2 在 vscode 中使用 2.类型声明 2.1 变量声明 2.1.1 var 2.1.2 const 和 final 2.1.3 dynamic 和 Object 2.1.4 默认值 2.2 数据类型 2.2.1 Number 2.2.2 String 2.2.4 List 2.2.5 Set 2.2.6 Map 2.2.7 Runes(字符) 2.2.8 Symbols(符号) 2.2.9 枚举类型 前言 最近在学习做 flutter 移动端开
-
Dart多态控制反转编码规范实例详解
目录 前言 举栗子 方式一:通过传参构造器进行控制反转 方式二:通过继承 + 泛型进行解耦 前言 我们通常都知道程序设计要依赖抽象,提高复用性,做到对扩展开放,对修改关闭.贯彻SOLID五大原则的最重要法宝就是抽象和继承.多态是一种手段,下面,通过简单 demo 介绍 flutter 开发中常用的最佳实践. 举栗子 /// 不推荐,避免把逻辑放在公共底层处理 class TestWidget extends StatefulWidget { const TestWidget({Key? key}
-
Flutter入门学习Dart语言变量及基本使用概念
目录 正文 变量 变量的声明赋值 变量的划分 默认值 变量的类型推断修饰符 Late变量 类型判断is和类型转换as 一些重要概念 空安全和可空类型? 表达式和语句 注释 DartPad 正文 Dart是Google发布的开源编程语言,是一种面向对象的语言.其主要应用是Flutter框架开发(Android.IOS),此外,也可以用在服务器.脚本.Web开发中.随着Flutter3.0开始支持全平台开发,Dart也可以实现桌面应用. 关于Dart的介绍不再细说.下面开始Dart的使用介绍 首先记
-
Flutter 中 Dart的Mixin示例详解
原文在这里.写的不错,推荐各位看原文. 这里补充一下Mixin的定义: 只要一个类是继承自Object的而且没有定义构造方法,那么这个类可以是一个Mixin了.当然,如果你想让mixin的定义更加的清晰,可以使用mixin关键字开头来定义.具体请参考这里 原文截图体会一下风格. 正文 在经典的面向对象编程语言里一定会有常规的类,抽象类和接口.当然,Dart也有它自己的接口,不过那是另外的文章要说的.有的时候阴影里潜伏者另外的野兽:Mixin!这是做什么的,如何使用?我们来一起发现. 没有mixi
-
Flutter 绘制风车实现示例详解
目录 前言展示 1. 风车 1 的绘制 2. 风车 2 的绘制 3. 旋转动画的处理 4. 旋转动画的圈数 前言展示 最近源码看得比较多,本文来画点东西调节下心情,本绘制已收录于 FlutterUnit 的绘制集录,本文源码可参见[windmill.dart] .绘制内容非常简单,如下所示,两个样式的小风车:通过这两个小例子,可以学到: 路径的使用 画板的旋转变换 动画曲线与 Tween 的使用 风车1 风车2 1. 风车 1 的绘制 第一个风车非常简单,由四个 半圆 组成,每个部分直接的关系是
-
Flutter CustomPaint自定义绘画示例详解
目录 正文 CustomPaint 介绍 绘制点 PointMode3种模式 绘制线 和路径 绘制五子棋 总结 正文 CustomPaint是Flutter中用于自由绘制的一个widget,它与android原生的绘制规则基本一致,以当前Canves(画布)的左上角为原点进行绘制.在有些场景中,我们会需要绘制一些高度定制化的组件,比如 UI 设计师给我们出了个难题 —— 弄一个奇形怪状的边框.这个时候我们就不能直接使用 Flutter 自带的那些组件了,而是需要手动绘制组件,那就会需要用到 Cu
-
java 实现迷宫回溯算法示例详解
用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难,我们主要是要实现findRoad()这个方法,在实现这个方法前,我们需要约定好一下几个点:小球的位置当作入口(1,1),小旗的位置当作出口(5,5)数组里数的含义分别为(0没有走过).(1障碍).(2走过且为正确的路线).(3走过且为错误的路线)将我们每一步的走法称为策略:下 -> 右 -> 上
-
python机器学习Sklearn实战adaboost算法示例详解
目录 pandas批量处理体测成绩 adaboost adaboost原理案例举例 弱分类器合并成强分类器 pandas批量处理体测成绩 import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt data = pd.read_excel("/Users/zhucan/Desktop/18级高一体测成绩汇总.xls") cond =
-
封装flutter状态管理工具示例详解
目录 引言 RxBinder 代码实现 Demo 完美运行 引言 关于 Flutter 状态管理,公司项目使用的是Bloc方案.Bloc 其实本质上是 provider 的封装扩展库,整体通过 InheritedWidget .Notifier 外加 Stream中转实现状态变更通知. 关于 Bloc 实现原理,有兴趣的同学可以观看这篇文章 Bloc原理解析 RxBinder 撇开Bloc内部实现策略,小轰尝试基于数据驱动模型,自定义一套状态管理工具.构思如下: 主要成员如下: RxBinder
-
flutter text组件使用示例详解
目录 正文 Text组件 Text组件构造器上的主要属性 正文 flutter组件的实现参考了react的设计理念,界面上所有的内容都是由组件构成,同时也有状态组件和无状态组件之分,这里简单介绍最基本的组件. 在组件代码的书写方式上,web端开发的样式主要有由css进行控制,而客户端开发根据使用的技术栈不同,写法也稍微有些不同:ReactNative的写法和web比较类似,但是ReactNative是使用StyleSheet.create()方法创建样式对象,以内联的方式进行书写. import
-
Flutter Drawer抽屉菜单示例详解
本文实例为大家分享了Flutter Drawer抽屉菜单示例代码,供大家参考,具体内容如下 一.Flutter Drawer组件简介 1.源码查看 const Drawer({ Key? key, this.elevation = 16.0, //阴影效果大小 this.child, //内容元素 this.semanticLabel, //关闭/打开抽屉时的通知信息 }) 二.抽屉菜单示例 1.菜单项,使用 ListTile 实现 Expanded(
-
Vue3组件更新中的DOM diff算法示例详解
目录 同步头部节点 同步尾部节点 添加新的节点 删除多余节点 处理未知子序列 移动子节点 建立索引图 更新和移除旧节点 移动和挂载新节点 最长递增子序列 总结 总结 在vue的组件更新过程中,新子节点数组相对于旧子节点数组的变化,无非是通过更新.删除.添加和移动节点来完成,而核心 diff 算法,就是在已知旧子节点的 DOM 结构.vnode 和新子节点的 vnode 情况下,以较低的成本完成子节点的更新为目的,求解生成新子节点 DOM 的系列操作. 举例来说,假说我们有一个如下的列表 <ul>
-
将15位身份证补全为18位身份证的算法示例详解
前言 最近在参与一个银行项目-某银行安防系统-反洗钱需求的开发,银行项目的离不开身份证号码,身份证号码作为我国公民的唯一标识,有这非同寻常的意义,由于业务的要求15位的身份证号码无法命中,所以需要补全为18位,一开始自己想着加个年份的前两位,后面再加个X不就行了嘛,后来代码写不下去了,上网查了资料,才知道自己想的是多么天真,还是比较复杂的,折腾了一下午终于有了眉目. 一.15位身份证和18位身份证号码结构介绍 要进行身份证号码的验证,首先需要了解我国身份证号码的编码规则.我国身份证号码多由若干位
随机推荐
- 在一个项目中同时使用Swift和Objective-C代码混合编程的方法
- JavaScript设计模式之单件模式介绍
- mysql数据表按照某个字段分类输出
- 修改flash之必备软件硕思闪客精灵3.3注册破解版下载
- 比较全面的C 、Java、JavaScript中的正则表达式详解
- Java IO流 文件的编码实例代码
- ASP.NET编程中的十大技巧第1/2页
- JavaScript中的跨浏览器事件操作的基本方法整理
- JS实现模仿微博发布效果实例代码
- PHP5.5迭代生成器用法实例详解
- PHP微信开发之根据用户回复关键词\位置返回附近信息
- jsp输出九九乘法表的简单实例
- Linux 中C语言getcwd()函数的用法
- 韩国商业网站设计分析
- 分享我对JS插件开发的一些感想和心得
- order by newid() 各种数据库随机查询的方法
- SQL SERVER数据库开发之存储过程应用
- javaScript实现复选框全选反选事件详解
- php,js,css字符串截取的办法集锦
- 浅析Android手机卫士之手机实现短信指令获取位置