Partition算法以及其应用详解上(Golang实现)
最近像在看闲书一样在看一本《啊哈!算法》
当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读。实际上作者描述算法的能力的确令人佩服。就当复习常用算法吧。
后面会依次纪录一下我觉得有意思的常用算法使用,这次就是快排。
快速排序简介:
快排的中心思想还是二分法,通过partition算法,先将需要排序的数组分为两个部分,再用递归的思想反复这个过程。最后将排序好的最小单元再依次组装起来获得最后的数据。快排的平均时间复杂度是O(nlogN),最糟糕的情况是O(N平方)。
Partition算法:
partition算法是一种分类算法,简单来说就把一个序列分成前后两部分,前一部分都是满足某一条件的元素,后一部分都是不满足该条件的元素。最著名的应用可能就是快速排序中的partition了。我们先找出一个元素,然后以该元素为基准点将小于他的全部放置到一边,将大于他的数全部放置到另外一边。最后返回pivot索引位置。这里我们默认使用数组的第一个数作为pivot
下面来看快速排序中partition的实现:
func partition(left int, right int, list []int) (int) {
i := left
j := right
temp := list[left]
for i != j {
for i < j && list[j] >= temp {
j--
}
for i < j && list[i] <= temp {
i++
}
if i < j {
list[i], list[j] = list[j], list[i]
}
}
list[left], list[i] = list[i], list[left]
return i
}
我们接收数组,左起始点,右结束索引作为参数。
默认将数组的第一个数作为索引点,然后将小于他的数放置在左边,将大于他的数放置在右边。
快速排序:
通过递归partition函数我们就能始终将数分成左右两边,最后再合并起来就可以了。
所以实际快速排序只是在partition算法的基础上使用递归法。最后获取结果。上面的partition算法我使用了两根指针同时从左右两边进行扫描。把扫描到的左右两个数调换位置,从而二分效率。
完整的代码:
func quickSort(left int, right int, list []int) {
if left >= right {
return
}
i := left
j := right
temp := list[left]
for i != j {
for i < j && list[j] >= temp {
j--
}
for i < j && list[i] <= temp {
i++
}
if i < j {
list[i], list[j] = list[j], list[i]
}
}
list[left], list[i] = list[i], list[left]
quickSort(left, i, list)
quickSort(i+1, right, list)
return
}
Reference:
《啊哈!算法》-> 啊哈磊著
Partition算法以及其应用详解上(Golang实现)的更多相关文章
- Partition算法以及其应用详解下(Golang实现)
接前文,除了广泛使用在快速排序中.Partition算法还可以很容易的实现在无序序列中使用O(n)的时间复杂度查找kth(第k大(小)的数). 同样根据二分的思想,每完成一次Partition我们可以 ...
- SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法
本文转载自SSL/TLS协议详解(上):密码套件,哈希,加密,密钥交换算法 导语 作为一名安全爱好者,我一向很喜欢SSL(目前是TLS)的运作原理.理解这个复杂协议的基本原理花了我好几天的时间,但只要 ...
- python 排序算法总结及实例详解
python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...
- IE8“开发人员工具”使用详解上(各级菜单详解)
来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...
- C++框架_之Qt的窗口部件系统的详解-上
C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...
- [js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解(上)
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
- SSD算法及Caffe代码详解(最详细版本)
SSD(single shot multibox detector)算法及Caffe代码详解 https://blog.csdn.net/u014380165/article/details/7282 ...
- Linux常用命令详解上
Linux常用命令详解上 目录 一.shell 二.Linux命令 2.1.内部命令与外部命令的区别 2.2.Linux命令行的格式 2.3.编辑Linux命令行的辅助操作 2.4.获得命令帮助的方法 ...
- 红黑树原理详解及golang实现
目录 红黑树原理详解及golang实现 二叉查找树 性质 红黑树 性质 operation 红黑树的插入 golang实现 类型定义 leftRotate RightRotate Item Inter ...
随机推荐
- SpringBoot的简单登陆开发例子
1:这个例子用spirngboot整合mybatis,jdbc等技术开发的 2:步骤 2.1:新建一个工程 主要的两个步骤已经贴图了,第二张图是直接在pom.xml文件中加入依赖 2.2:新建完项目, ...
- P1460 健康的荷斯坦奶牛 Healthy(DFS)
思路:这道题还是用了小小的剪枝,这里要注意的是该题有很多中构建树的顺序,但是,在这众多顺序中不一定都能保证输出的方案字典序最小. 构建搜索树:如图构建 剪枝,emmm,看代码: #include< ...
- PHP HMAC_SHA1 算法 生成算法签名
HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议. 它可 ...
- day07----字符编码解码、文件操作(1)
字符编码: 什么是字符编码? 字符编码是将人识别的字符转换成计算机能识别的二进制字符(01),转换的规则就是编码表. 人能识别的字符串 与 计算机能识别的二进制字符 两者之间对应关系构成的结构称为 ...
- layui之日期和时间组件
参考文档:https://www.layui.com/doc/modules/laydate.html代码片段如下: layui.use('laydate', function(){ var layd ...
- python:面向对象编程之Zope.interface安装使用
持续学习python+django中... 一.接口简述 在我们所熟知的面向对象编程语言中,大多提供了接口(interface)的概念.接口在编程语言中指的是一个抽象类型,是抽象方法的集合:它的特点如 ...
- C#_IO操作_查询指定文件夹下的每个子文件夹占空间的大小
1.前言 磁盘内存用掉太多,想查那些文件夹占的内存比较大,再找出没有用的文件去删除. 2.代码 static void Main(string[] args) { while (true) { //指 ...
- 网络爬虫之Url含有中文如何转码
一:背景 今天在使用Jsoup对一个网站进行数据爬取,发现爬取内容为该搜索结果是0条,请求头啥的都填好,利用Chrome开发者工具发现请求Url路径不含中文,抱着试一试的态度,我复制此段非中文参数进行 ...
- Omi教程-组件通讯攻略大全
组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...
- HAProxy 参数配置
RabbitMQ集群部署完成,通过HAProxy反向代理来提供统一的对RabbitMQ的访问入口. 1.Haproxy提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理.(负载均衡策略有很 ...