0
点赞
收藏
分享

微信扫一扫

golang的快速排序

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

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



举报

相关推荐

0 条评论