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 ...
随机推荐
- Python之Requests库的异常
异常 说明 requests.ConnectionError 网络链接错误一场,如 ...
- tensorflow错误:Shape (10, ?) must have rank at least 3
错误的代码 outputs, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32) 错误原因: 该错误的意思是传入的数据集X的维度只有二维,而tf.nn.d ...
- html js获取URL传参
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code function GetQueryString(name) { var re ...
- 【js】event(事件对象)详解
1.事件对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 什么时候会产生Event 对象呢? 例如: 当用户单击某个元素的时候,我们给这个元 ...
- 003_webpack 配合babel 将es6转成es5
今天接触了webpack,第一次使用webpack进行转码,竟然稀里糊涂就成功了,哈哈. 下面附上流程 创建个文件夹,初始化一下,首先全局安装webpack npm install webpack - ...
- 给大家推荐一个C#下的Ribbon风格的Forms实现示例-含源码
C#下的Ribbon风格的Forms实现示例:源码下载地址
- Java关键字(三)——static
我们说Java是一种面向对象编程的语言,而对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,对同类对象抽象出其共性,便是Java中的类,我们可以用类描述世间万物,也可以说万物皆对象.但是 ...
- springmvc+thymeleaf搭建框架启动报错
最近项目开发需要用到thymeleaf前端界面模板引擎,所以提前了解学习一下,但是在框架搭建好了之后启动tomcat一直提示如下错误: org.springframework.beans.factor ...
- Scala学习(九)练习
文件正则表达式&练习 1. 编写一小段Scala代码,将某个文件中的行倒转顺序,将最后一行作为第一行,依此类推 程序代码: import scala.io.Source import java ...
- Winform开发框架中的内容及文档管理模块功能介绍
在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...