首页 > 其他分享 >golang的快速排序

golang的快速排序

时间:2022-12-04 23:31:37浏览次数:37  
标签:10 begin int list golang array 排序 快速

1、什么是快速排序:

快速排序是一种分治策略的排序算法,本质上来看,快速排序是对冒泡排序的一种改进,属于交换类的排序算法。是由英国计算机科学家 Tony Hoare​ 发明的, 该算法被发布在 1961​ 年的 Communications of the ACM 国际计算机学会月刊。

注: ACM = Association for Computing Machinery,国际计算机学会,世界性的计算机从业员专业组织,创立于1947年,是世界上第一个科学性及教育性计算机学会。

快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤如下:

a、先从数列中取出一个数作为基准数。一般取第一个数。

b、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

c、再对左右区间重复第二步,直到各区间只有一个数。

案例说明:

{6,8,7,2,10,4,9}这里用红色的字体表示原理运算过程。i=1,j=6。i表示数列下标单元要与基准数3进行比较。j表示是往右区移动的下标单元。

6,8,7,2,10,4,9---  ​i=1,j=6 第一元素3位基准数,8开始与第一个元素6进行比较。8>6时,8与9互换位置 。j--

6,9,7,2,10,4,8--- i=1,j=5    8与9互换位置后,然后标志变成4和9,再用9跟6进行比较,9>6时,9与4互换位置 。j--

6,4,7,2,10,9,8---- i=1,j=4    9与4互换位置后,标志数变成了10和4,再用4与6比较,4>6为false时,不做位置互换,i++

6,4,7,2,10,9,8-----  i=2,j=4    4与10交换后,标志数变成了7和10,再用7与6比较,7>6时,7和10互换位置。j--

6,4,10,2,7,9,8---    i=2,j=3  7与10互换位置后,标志数变成了10和2,再用10与6比较,10>6时,10与2互换位置。j--

6,4,2,10,7,9,8        i=2,j=2  这个时候i与j都为2,位置重合。这个时候再做一次[2]与[0]互换位置。

2,4,6,10,7,9,8  这是第一轮切分区结果。

6基准数的左边区为2,4。这时左区的值一定比6小。

6基准数的右边区为10,7,9,8 这时右区的值一定比6大

接着再针对左右区进行排序。

用代码来实现以上的案例。

package main
import "fmt"
// QuickSort 普通快速排序
func QuickSort(array []int, begin, end int, l *int) {

if begin < end {
// 进行切分
loc := partition(array, begin, end, l)
// 对左部分进行快排
QuickSort(array, begin, loc-1, l)
// 对右部分进行快排
QuickSort(array, loc+1, end, l)
}
}

// 切分函数,并返回切分元素的下标
func partition(array []int, begin, end int, l *int) int {
// 将array[begin]作为基准数,因此从array[begin+1]开始与基准数比较!
i := begin + 1
// array[end]是数组的最后一位
j := end
// 没重合之前
for i < j {
if array[i] > array[begin] {
array[i], array[j] = array[j], array[i] // 交换
j--
} else {
i++
}
*l++
}
/* 跳出 for 循环后,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--
}
array[begin], array[i] = array[i], array[begin]
return i
}

func main() {
list := []int{6, 8, 7, 2, 10, 4, 9}
l := 0
QuickSort(list, 0, len(list)-1, &l)
fmt.Println(list)
fmt.Println(l)
}

golang的快速排序_数据


用冒泡排序代码

package main

import (
"fmt"
)

func main() {
var nums = []int{6, 8, 7, 2, 10, 4, 9}
BubbleSort(nums)
fmt.Println(nums)
}
func BubbleSort(list []int) {
listLen := len(list)
loop := 0
for i := listLen - 1; i > 1; i-- {
didSwap := false
for j := 0; j < i; j++ {
if list[j] >= list[j+1] {
list[j], list[j+1] = list[j+1], list[j]
didSwap = true
}
loop++
}
if !didSwap {
fmt.Println(loop) //打印循环次数
return
}
}
}


golang的快速排序_快速排序_02

通过上面两个例子比较。快速比较效率比冒泡高效一倍多。



标签:10,begin,int,list,golang,array,排序,快速
From: https://blog.51cto.com/wyf1226/5910112

相关文章

  • Go-08 Golang中的切片
    packagemainimport"fmt"//Go语言中的切片/* 学习目标 1.为什么要使用切片 2.切片的定义 3.关于nil的认识 4.切片的循环遍历 5.基于数组定义切片 6.切片再切......
  • Golang反射修改变量值
    1.前言前面的随笔Golang反射获取变量类型和值分享了如何通过反射获取变量的类型和值,也就是Golang反射三大定律中的前两个,即从interface{}到反射对象和从反射对象到inter......
  • 排序简介
    排序的概念及其运用排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键......
  • 排序算法:快速排序
    简介快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排......
  • 排序算法:比较排序
    算法简介:排序排序是一个非常经典的问题,它以特定顺序(递增、非递减(递增或扁平))对数组(或列表)的项目(可以比较,例如整数、浮点数、字符串等)进行重新排序)、递减、非递增(递减或平......
  • 排序算法:非比较排序
    堆排序voidAdjustDown(int*arr,intsz,introot)//向下调整{ intparent=root; intchild=root*2+1; while(child<sz) { if(child+1<sz&&ar......
  • 排序算法:归并排序
    递归实现void_MergeSort(int*arr,intleft,intright,int*tmp){ if(left>=right) return; intmid=left+(right-left)/2; _MergeSort(arr,left,......
  • 快速创建spring boot 项目
    因为我装的是社区版idea, 不能安装springinitializer插件,所以只能在网站上create.GENERATE 然后下载下来即可:https://start.spring.io/ ......
  • Golang抢占式调度
    Golang抢占式调度在1.12版本之前,go的调度器不支持抢占式调度,程序只能依靠Goroutine主动让出CPU资源才能触发调度,会引发一些问题,如某些Goroutine可以长时间占用线程,造成......
  • Golang 协程调度器原理及GPM模型
    目录进程和线程内核级线程用户级线程协程协程与线程的关系N:11:1M:Ngoroutine旧版本goroutine调度器调度器的实现Goroutine调度器的GMP模型设计思想GPM结构组成GPM运行模型......