面试经典算法:快速排序Golang实现
Golang快速排序
定义
快速排序由C. A. R. Hoare在1962年提出。快速排序是对冒泡排序的一种改进,采用了一种分治的策略。
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤
- 先从数列中取出一个数作为基准数。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
package main
import "fmt"
/************************************
*函数名:quicksort
*作用:快速排序算法
*参数:
*返回值:无
*模拟:
begin:[]int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
-->[],12,[25 16 34 23 49 95 17 61]
---->[23 16 17],25,[95 49 61 85]
------>[17 16],23,[]
-------->[16],17,[]
---------->[],16,[]
------>[34 49 61 85],95,[]
-------->[],34,[61 85 95]
---------->[49],61,[95]
------------>[],49,[]
------------>[85],95,[]
-------------->[],85,[]
last:[]int{12, 16, 17, 23, 25, 34, 49, 61, 85, 95}
************************************/
func quicksort(array []int, begin, end int, mark string) {
var i, j int
if begin < end {
i = begin + 1 // 将array[begin]作为基准数,因此从array[begin+1]开始与基准数比较!
j = end // array[end]是数组的最后一位
for {
if i >= j {
break
}
if array[i] > array[begin] {
array[i], array[j] = array[j], array[i]
j = j - 1
} else {
i = i + 1
}
}
/* 跳出while循环后,i = j。
* 此时数组被分割成两个部分 --> array[begin+1] ~ array[i-1] < array[begin]
* --> array[i+1] ~ array[end] > array[begin]
* 这个时候将数组array分成两个部分,再将array[i]与array[begin]进行比较,决定array[i]的位置。
* 最后将array[i]与array[begin]交换,进行两个分割部分的排序!以此类推,直到最后i = j不满足条件就退出!
*/
if array[i] >= array[begin] { // 这里必须要取等“>=”,否则数组元素由相同的值时,会出现错误!
i = i - 1
}
array[begin], array[i] = array[i], array[begin]
fmt.Printf("%s>%v,%d,%v\n", mark, array[begin:i], array[i], array[j:end])
quicksort(array, begin, i, mark+"--")
quicksort(array, j, end, mark+"--")
}
}
func main() {
nums := []int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
fmt.Printf("begin:%#v\n", nums)
// 缩进
mark := "--"
quicksort(nums, 0, len(nums)-1, mark)
fmt.Printf("last:%#v\n", nums)
}
转载请注明:http://www.lenggirl.com/algorithm/quicksort.html
面试经典算法:快速排序Golang实现的更多相关文章
- 面试经典算法题集锦——《剑指 offer》小结
从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer.经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升. 实话说对于未 ...
- 面试经典算法:马拉松算法,最长回文子串Golang实现
求一个字符串中最长的回文子串. package main import "fmt" /* 马拉松算法,求最长回文子串,时间复杂度:线性 */ func main() { // 回文 ...
- 面试经典算法:优先队列,最大堆,堆排序,左偏树Golang实现
堆排序 使用优先队列-最小/最大堆可实现. 优先队列 优先队列是一种能完成以下任务的队列:插入一个数值,取出最小的数值(获取数值,并且删除).优先队列可以用二叉树来实现,我们称这种为二叉堆. 最小堆 ...
- 几个面试经典算法题Java解答
题目一: public class testClockwiseOutput { //顺时针打印一个矩阵 @Test public void test(){ int[][] num = new int[ ...
- 10个经典的C语言面试基础算法及代码
10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...
- July-程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总结 http://blog.csdn.net/v_july_v/article/details/6543438
- 大公司面试经典数据结构与算法题C#/Java解答
几个大公司(IBM.MicroSoft and so on)面试经典数据结构与算法题C#解答 1.链表反转 我想到了两种比较简单的方法 第一种是需要开一个新的链表,将原链表的元素从后到前的插入到新链表 ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
- 数据结构和算法(Golang实现)(25)排序算法-快速排序
快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...
随机推荐
- REST架构原则初探
目录 什么是RESTful架构? REST 架构原则 资源(Resource) 表现层(Representation) 状态转换(State Transfer) 无状态通信原则 RESUful API ...
- Linux Bash Shell j简单入门
BASH 的基本语法 最简单的例子 —— Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1 ...
- BAT文件运行时不显示命令窗口的方法
可以编一个VBS文件调用BAT文件,使运行BAT文件时不显示命令窗口. 新建一个记事本文件,保存为abc.vbs,在文件中加入如下代码: Set shell = Wscript.createobjec ...
- redis json 降低性能 使用 hash
使用hashtable和hash-max-zipmap-entries内存优化和效率http://www.flyfifi.cn/blog/detail/71/
- SQL-W3School-函数:SQL SUM() 函数
ylbtech-SQL-W3School-函数:SQL SUM() 函数 1.返回顶部 1. SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM( ...
- Packetbeat简介
Packetbeat简介 抓包示例 下载packetbeat 抓取elasticsearch的包 ①启动elasticsearch 启动packetbeat 配置es.yml ############ ...
- osg::NodeVisitor
[1]osg::Group [2]osg::PositionAttitudeTransform [2]osg::MatrixTransform [3]osg::Geode [2]osg::Matrix ...
- AES加密(java和C#)
需求:Java和C#进行数据交互,互相采用AES/CBC/PKCS5Padding进行加解密 Java加密和解密的代码如下: /** * 加密 1.构造密钥生成器 2.根据 ecnodeRules 规 ...
- PHP上传文件 Error 6解决方法 (转)
按:我采用phpstudy2016,编辑php.ini ,“upload_tmp_dir没放开,直接放开,并指向 /tmp 就OK 上传文件,$_FILES["file"][&qu ...
- LeetCode_112. Path Sum
112. Path Sum Easy Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...