go语言实现快速排序
来源:互联网 发布:意大利java自行车 编辑:程序博客网 时间:2024/05/29 03:15
先看一下c++的实现方法:
1、快速排序的描述
快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:
(1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...r],给定一个枢轴,使得A[p...q-1]中的每个元素小于等于A[q],A[q+1...r]中的每个元素大于等于A[q],q下标是在划分过程中计算得出的。
(2)解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序。
(3)合并:因为两个子数组是就地排序,不需要合并操作,整个数组A[p…r]排序完成。
快速排序关键过程是对数组进行划分,划分过程需要选择一个主元素(pivot element)作为参照,围绕着这个主元素进划分子数组。举个列说明如何划分数组,现有子数组A={24,15,27,5,43,87,34},以最后一个元素为主元素进行划分,划分过程如图所示:
根据划分过程的为代码,书中又给出了快速排序的为代码:
1 QUICKSORT(A,p,r)2 if p<r3 q = PARTITION(A,p,r) //确定划分位置4 QUICKSORT(A,p,q-1) //子数组A[p...q-1]5 QUICKSORT(Q,q+1,r) //子数组A[q+1...r]
2.go语言的方法
先说明这个快速排序法的概念,它以最右边的值s作比较的标准,将整个数列分为三个部份,一个是小于s的部份,一个是大于s的部份,一个是未处理的部份,如下所示 :
在排序的过程中,i 与 j 都会不断的往右进行比较与交换,最后数列会变为以下的状态:
然后将s的值置于中间,接下来就以相同的步骤会左右两边的数列进行排序的动作,如下所示:
整个演算的过程,直接摘录书中的虚拟码来作说明:
QUICKSORT(A, p, r) if p < r then q <- PARTITION(A, p, r) QUICKSORT(A, p, q-1) QUICKSORT(A, q+1, r) end QUICKSORT PARTITION(A, p, r) x <- A[r] i <- p-1 for j <- p to r-1 do if A[j] <= x then i <- i+1 exchange A[i]<->A[j] exchange A[i+1]<->A[r] return i+1 end PARTITION
一个实际例子的演算如下所示:
具体代码如下:
package mainimport ("fmt")const MAX = 10var sortArray = []int{41, 24, 76, 11, 45, 64, 21, 69, 19, 36}func main() {fmt.Println("before sort:")show()quickSort(sortArray, 0, MAX-1)fmt.Println("after sort:")show()}func quickSort(sortArray []int, left, right int) {if left < right {pos := partition(sortArray, left, right)partition(sortArray, left, pos-1)partition(sortArray, pos+1, right)}}func partition(sortArray []int, left, right int) int {key := sortArray[right]i := left - 1for j := left; j < right; j++ {if sortArray[j] <= key {i++swap(i, j)}}swap(i+1, right)return i + 1}// Swap the position of a and bfunc swap(a, b int) {sortArray[a], sortArray[b] = sortArray[b], sortArray[a]}// foreachfunc show() {for _, value := range sortArray {fmt.Printf("%d\t", value)}}
0 0
- go语言实现快速排序
- GO语言quicksort实现.快速排序法代码实现
- 算法代码实现之快速排序,Golang(Go语言)实现
- 排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序
- GO实现 快速排序算法
- Go实现快速排序算法
- Go语言实现拓扑排序
- go语言快速排序Quick sort
- 算法代码实现之三向切分快速排序,Golang(Go语言)实现
- 图解算法练习--快速排序(GO实现)
- go语言写的并行排序算法(快速排序)
- Go语言对数组进行冒泡排序和快速排序
- Go语言实现位图排序(bitmap)
- 归并排序及go语言实现
- 堆排序算法及go语言实现
- 快速排序 C语言实现
- 快速排序C语言实现
- c语言实现快速排序
- bower 安装bootstrap 提示installing Bootstrap with Bower on mac says: Error: EACCES, permission denied
- Eclipse中启动Tomcat服务器时输出日志位置修改
- rethinkdb命令
- burp 设置过滤
- Liunx安装mysql,迁移数据库目录
- go语言实现快速排序
- MyBatis动态SQL之动态返回列(Dynamic Column)
- Mac下配置命令行启动genymotion模拟器
- 集合框架_泛型概述和基本使用
- 自定义实现LinkedList
- 进入activity类中,一些重写的方法的地方总是出现 "Remove @Overrideannotation"
- java中,堆、栈。。。
- uva 10285 Longest Run on a Snowboard
- 【c#】存一个Dataset的三层嵌套表格代码