feat(Go-Tool):新增二分法查找算法及其单测、插入查询及其单测、lomuto划分查询第k小元素及其单测、归并排序及其单测、快速排序及其单测.

This commit is contained in:
huangzj
2020-08-20 09:28:35 +08:00
parent fa58e1a97f
commit c2aca17567
12 changed files with 385 additions and 8 deletions
+54
View File
@@ -0,0 +1,54 @@
/*
* @Author : huangzj
* @Time : 2020/8/19 11:44
* @Description:这边提供一个递归的归并排序算法,非递归的理解成本比较高,并且还有多路归并排序,需要理解对应概念
* 最坏时间复杂度O(nlogn) 最好时间复杂度O(logn) 空间复杂度O(n)
*/
package sort
func MergeSort(list []int) {
middle := len(list) / 2
leftList := copyList(list, 0, middle)
rightList := copyList(list, middle, len(list))
if len(list) > 1 {
MergeSort(leftList) //先对左边进行归并排序
MergeSort(rightList) //再对右边进行归并排序
mergeAll(list, leftList, rightList) //对左右排序的结果进行组合
}
}
func copyList(list []int, start int, end int) []int {
result := make([]int, 0)
for i := start; i < end; i++ {
result = append(result, list[i])
}
return result
}
func mergeAll(array []int, left []int, right []int) {
l, r, i := 0, 0, 0 //左数组的下标、右数组的下标、组合数组的下标
for l < len(left) && r < len(right) {
if left[l] > right[r] {
array[i] = right[r]
i++
r++
} else {
array[i] = left[l]
i++
l++
}
}
for r < len(right) {
array[i] = right[r]
r++
i++
}
for l < len(left) {
array[i] = left[l]
l++
i++
}
}
+42
View File
@@ -0,0 +1,42 @@
/*
* @Author : huangzj
* @Time : 2020/8/19 11:45
* @Description
*/
package sort
import (
"fmt"
"testing"
)
func TestMergeSort(t *testing.T) {
list1 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
MergeSort(list1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
MergeSort(list2)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{100, 5, 222, 312, 552, 354, 8, 21, 90, 2, 0, 12, 345, 67}
MergeSort(list3)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
list4 := []int{1, 19, 42, 7, 3131, 44, 56, 123, 589, 21, 975, 123, 5467, 143, 7, 321, 77, 3}
MergeSort(list4)
for _, r := range list4 {
fmt.Print(r, " ")
}
fmt.Println()
}
+46
View File
@@ -0,0 +1,46 @@
/*
* @Author : huangzj
* @Time : 2020/8/19 17:06
* @Description
*/
package sort
import "Go-Tool/util/search"
//通过hoare划分来实现快速排序
func QuickSort(list []int, start, end int) {
if start < end {
position := hoarePartition(list, start, end)
QuickSort(list, start, position) //注意这边结束的下表是position,而不是position + 1
QuickSort(list, position+1, end)
}
}
//通过lomuto划分来实现快速排序
func QuickSort1(list []int, start, end int) {
if start < end {
position := search.LomutoPartition(list, start, end)
QuickSort(list, start, position)
QuickSort(list, position+1, end)
}
}
func hoarePartition(list []int, start int, end int) int {
value := list[start] //比较的元素
s := start
e := end
for s < e {
//找到数组终止前,比目标数(value)大的数字
for ; s < end && list[s] < value; s++ {
}
//找到数组结束前,比目标数(value)小的数字
for ; e > start && list[e] >= value; e-- {
}
if s < e {
list[s], list[e] = list[e], list[s]
}
}
list[start], list[e] = list[e], list[start]
return e
}
+80
View File
@@ -0,0 +1,80 @@
/*
* @Author : huangzj
* @Time : 2020/8/19 17:57
* @Description
*/
package sort
import (
"fmt"
"testing"
)
func TestQuickSort(t *testing.T) {
list := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
QuickSort(list, 0, len(list)-1)
for _, r := range list {
fmt.Print(r, " ")
}
fmt.Println()
list1 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
QuickSort(list1, 0, len(list1)-1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{432, 412, 213, 456, 7, 213, 4, 78, 13, 87, 312321, 456, 7, 231, 234, 3}
QuickSort(list2, 0, len(list2)-1)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{1, 312, 356, 76, 2, 54, 78, 321, 3455, 65732, 123534, 54351, 4213, 123, 56, 6, 732, 123, 44, 51, 5, 61, 543}
QuickSort(list3, 0, len(list3)-1)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
}
func TestQuickSort1(t *testing.T) {
list := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
QuickSort1(list, 0, len(list)-1)
for _, r := range list {
fmt.Print(r, " ")
}
fmt.Println()
list1 := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1}
QuickSort1(list1, 0, len(list1)-1)
for _, r := range list1 {
fmt.Print(r, " ")
}
fmt.Println()
list2 := []int{432, 412, 213, 456, 7, 213, 4, 78, 13, 87, 312321, 456, 7, 231, 234, 3}
QuickSort1(list2, 0, len(list2)-1)
for _, r := range list2 {
fmt.Print(r, " ")
}
fmt.Println()
list3 := []int{1, 312, 356, 76, 2, 54, 78, 321, 3455, 65732, 123534, 54351, 4213, 123, 56, 6, 732, 123, 44, 51, 5, 61, 543}
QuickSort1(list3, 0, len(list3)-1)
for _, r := range list3 {
fmt.Print(r, " ")
}
fmt.Println()
}