From f4f18b3866520f32023a89e7eef803ef617f86c7 Mon Sep 17 00:00:00 2001 From: huangzj Date: Thu, 20 Aug 2020 18:05:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(Go-Tool)=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=8E=92=E5=BA=8F=E5=8F=8A=E5=85=B6=E5=8D=95?= =?UTF-8?q?=E6=B5=8B=E3=80=81=E5=86=92=E6=B3=A1=E6=8E=92=E5=BA=8F=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=8D=95=E6=B5=8B=E3=80=81=E5=A0=86=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=8F=8A=E5=85=B6=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 ++ util/sort/BubbleSort.go | 17 +++++++++++++ util/sort/BubbleSort_test.go | 43 +++++++++++++++++++++++++++++++ util/sort/HeapSort.go | 43 +++++++++++++++++++++++++++++++ util/sort/HeapSort_test.go | 45 +++++++++++++++++++++++++++++++++ util/sort/SelectionSort.go | 20 +++++++++++++++ util/sort/SelectionSort_test.go | 43 +++++++++++++++++++++++++++++++ 7 files changed, 213 insertions(+) create mode 100644 util/sort/BubbleSort.go create mode 100644 util/sort/BubbleSort_test.go create mode 100644 util/sort/HeapSort.go create mode 100644 util/sort/HeapSort_test.go create mode 100644 util/sort/SelectionSort.go create mode 100644 util/sort/SelectionSort_test.go diff --git a/readme.md b/readme.md index 0fca93a..2cb5fd1 100644 --- a/readme.md +++ b/readme.md @@ -46,6 +46,8 @@ 2020/8/20:新增二分法查找算法及其单测、插入查询及其单测、lomuto划分查询第k小元素及其单测、归并排序及其单测、快速排序及其单测. +2020/8/20: 新增选择排序及其单测、冒泡排序及其单测、堆排序及其单测 + # mod vendor模式加载包 通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到 diff --git a/util/sort/BubbleSort.go b/util/sort/BubbleSort.go new file mode 100644 index 0000000..85da339 --- /dev/null +++ b/util/sort/BubbleSort.go @@ -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] + } + } + } +} diff --git a/util/sort/BubbleSort_test.go b/util/sort/BubbleSort_test.go new file mode 100644 index 0000000..cb62ea7 --- /dev/null +++ b/util/sort/BubbleSort_test.go @@ -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() + +} diff --git a/util/sort/HeapSort.go b/util/sort/HeapSort.go new file mode 100644 index 0000000..3203f75 --- /dev/null +++ b/util/sort/HeapSort.go @@ -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 //如果父节点大于两个自己点,则说明是完整的堆,则退出循环 + } + } +} diff --git a/util/sort/HeapSort_test.go b/util/sort/HeapSort_test.go new file mode 100644 index 0000000..44c015e --- /dev/null +++ b/util/sort/HeapSort_test.go @@ -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() + +} diff --git a/util/sort/SelectionSort.go b/util/sort/SelectionSort.go new file mode 100644 index 0000000..8307965 --- /dev/null +++ b/util/sort/SelectionSort.go @@ -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] + } +} diff --git a/util/sort/SelectionSort_test.go b/util/sort/SelectionSort_test.go new file mode 100644 index 0000000..460d480 --- /dev/null +++ b/util/sort/SelectionSort_test.go @@ -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() + +}