feat(Go-Tool):新增选择排序及其单测、冒泡排序及其单测、堆排序及其单测

This commit is contained in:
huangzj
2020-08-20 18:05:48 +08:00
parent c2aca17567
commit f4f18b3866
7 changed files with 213 additions and 0 deletions
+2
View File
@@ -46,6 +46,8 @@
2020/8/20:新增二分法查找算法及其单测、插入查询及其单测、lomuto划分查询第k小元素及其单测、归并排序及其单测、快速排序及其单测.
2020/8/20: 新增选择排序及其单测、冒泡排序及其单测、堆排序及其单测
# mod vendor模式加载包
通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到
+17
View File
@@ -0,0 +1,17 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 11:21
* @Description:冒泡排序
*/
package sort
func BubbleSort(list []int) {
for i := 0; i < len(list); i++ {
for j := i + 1; j < len(list); j++ {
if list[i] > list[j] {
list[i], list[j] = list[j], list[i]
}
}
}
}
+43
View File
@@ -0,0 +1,43 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 11:21
* @Description
*/
package sort
import (
"fmt"
"testing"
)
func TestBubbleSort(t *testing.T) {
list1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
BubbleSort(list1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
BubbleSort(list2)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{1, 432, 12, 67, 341, 874, 56332, 43, 6564, 234, 980, 4234, 6589932, 80, 42, 4234, 55}
BubbleSort(list3)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
list4 := []int{4523325, 21, 43, 1, 265, 7657, 8754, 234, 543, 536, 2, 6543, 772, 432, 5, 6, 7214, 6754}
BubbleSort(list4)
for _, r := range list4 {
fmt.Print(r, " ")
}
fmt.Println()
}
+43
View File
@@ -0,0 +1,43 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 16:13
* @Description:堆结构的基本特性:
* i 结点的父结点下标就为(i – 1) / 2。
* i 节点的左右子结点下标分别为2 * i + 1和2 * i + 2。
* 具体图解可参考:https://www.cnblogs.com/chengxiao/p/6129630.html
*/
package sort
func HeapSort(list []int) {
//构建堆,构建堆的算法,会根据父节点去构建子节点,并且再往上构建父节点的父节点..所以这边的构建只要到数组长度/2 -1就行.
//这样就可以涵盖它的两个子节点.
for i := len(list)/2 - 1; i >= 0; i-- {
makeHeap(list, i, len(list))
}
//构建的是最大堆,每次最大的元素都在第0个位置,所有每一次构建堆,都要把第0个位置的数置换到对应的当前的最后一个位置.
//上面已经构建了一个完整的堆,所以这边只需要对堆进行调整即可
for j := len(list) - 1; j > 0; j-- {
list[j], list[0] = list[0], list[j] //将堆顶元素与末尾元素进行交换
makeHeap(list, 0, j) //重新对堆进行调整(这个时候是对除去了上次的最大节点的堆进行重组)
}
}
//构建堆算法
func makeHeap(list []int, start int, end int) {
temp := list[start] //先把当前父节点的值保存下来
for i := 2*start + 1; i < end; i = 2*start + 1 {
//如果左子树值比右子树小,那么要比较的就是右子树和父节点
if i < end-1 && list[i] < list[i+1] {
i++
}
//如果被比较的子节点更大,则应该放在父节点的位置.并且开始节点往后移动,比较下一个节点(当前父节点的子节点)的父子节点值.
if list[i] > temp {
list[start], list[i] = list[i], list[start]
start = i
} else {
break //如果父节点大于两个自己点,则说明是完整的堆,则退出循环
}
}
}
+45
View File
@@ -0,0 +1,45 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 16:13
* @Description:堆结构的基本特性:
* i 结点的父结点下标就为(i – 1) / 2。
* i 节点的左右子结点下标分别为2 * i + 1和2 * i + 2。
*/
package sort
import (
"fmt"
"testing"
)
func TestHeapSort(t *testing.T) {
list1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
HeapSort(list1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
HeapSort(list2)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{1, 432, 12, 67, 341, 874, 56332, 43, 6564, 234, 980, 4234, 6589932, 80, 42, 4234, 55}
HeapSort(list3)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
list4 := []int{4523325, 21, 43, 1, 265, 7657, 8754, 234, 543, 536, 2, 6543, 772, 432, 5, 6, 7214, 6754}
HeapSort(list4)
for _, r := range list4 {
fmt.Print(r, " ")
}
fmt.Println()
}
+20
View File
@@ -0,0 +1,20 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 11:28
* @Description
*/
package sort
func SelectSort(list []int) {
var minPoint int
for i := 0; i < len(list); i++ {
minPoint = i
for j := i + 1; j < len(list); j++ {
if list[j] < list[minPoint] {
minPoint = j
}
}
list[i], list[minPoint] = list[minPoint], list[i]
}
}
+43
View File
@@ -0,0 +1,43 @@
/*
* @Author : huangzj
* @Time : 2020/8/20 11:28
* @Description
*/
package sort
import (
"fmt"
"testing"
)
func TestSelectSort(t *testing.T) {
list1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
SelectSort(list1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
SelectSort(list2)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{1, 432, 12, 67, 341, 874, 56332, 43, 6564, 234, 980, 4234, 6589932, 80, 42, 4234, 55}
SelectSort(list3)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
list4 := []int{4523325, 21, 43, 1, 265, 7657, 8754, 234, 543, 536, 2, 6543, 772, 432, 5, 6, 7214, 6754}
SelectSort(list4)
for _, r := range list4 {
fmt.Print(r, " ")
}
fmt.Println()
}