Skip to content

Commit d0a85e1

Browse files
committed
2017.4.19
Finish Sort Algorithm
1 parent 61a13b7 commit d0a85e1

File tree

15 files changed

+484
-16
lines changed

15 files changed

+484
-16
lines changed

Algorithm/Sort/Binary_Insert_Sort/binary_insert_sort.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func Binary_Insert_Sort(nums []int) {
2121
right = middle - 1
2222
}
2323
}
24-
for j := i; i > left ; j-- {
24+
for j := i; j > left ; j-- {
2525
nums[j] = nums[j-1]
2626
}
2727
nums[left] = insertNum

Algorithm/Sort/Bubble_Sort/bubbl_sort.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,11 @@
77
package Bubble_Sort
88

99
func Bubble_Sort(nums []int) {
10-
for i := len(nums); ; i-- {
11-
swap := false
12-
for j := 1; j <= i; j++ {
13-
if nums[j-1] > nums[j] {
14-
swap = true
15-
nums[j-1], nums[j] = nums[j], nums[j-1]
10+
for i := 0; i < len(nums); i++ {
11+
for j := i + 1; j < len(nums); j++ {
12+
if nums[i] > nums[j] {
13+
nums[i], nums[j] = nums[j], nums[i]
1614
}
1715
}
18-
if swap == false {
19-
break
20-
}
2116
}
2217
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/19 12:05
5+
*/
6+
7+
package Comb_Sort
8+
9+
func Comb_Sort(nums []int) {
10+
gap := len(nums)
11+
for {
12+
if gap > 1 {
13+
gap = gap * 100 / 124
14+
}
15+
for i := 0; (i+gap) < len(nums); i++ {
16+
if nums[i] > nums[i+gap] {
17+
nums[i], nums[i+gap] = nums[i+gap], nums[i]
18+
}
19+
}
20+
if gap == 1 {
21+
break
22+
}
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/19 11:09
5+
*/
6+
7+
package Count_Sort
8+
9+
func Count_Sort(nums []int, max int) {
10+
// max是需要排序的数的数值的最大值
11+
markArray := make([]int, max)
12+
for i := 0; i < len(nums); i++ {
13+
markArray[nums[i]] ++ // 统计每个元素出现的次数
14+
}
15+
k := 0
16+
for i := 0; i < max; i++ {
17+
if markArray[i] != 0 {
18+
for j := 0; j < markArray[i]; j++ {
19+
nums[k] = i
20+
k ++
21+
}
22+
}
23+
}
24+
}

Algorithm/Sort/Heap_Sort/heap_sort.go

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,49 @@
66

77
package Heap_Sort
88

9-
import "Golang_Algorithm/Data_Structure/Heap"
9+
//import "Golang_Algorithm/Data_Structure/Heap"
1010

1111
func Heap_Sort(nums []int) {
12-
sortHeap := heap.NewMin()
13-
for i := 0; i < len(nums); i++ {
14-
sortHeap.Insert(heap.Int(nums[i]))
12+
//sortHeap := heap.NewMin()
13+
//for i := 0; i < len(nums); i++ {
14+
// sortHeap.Insert(heap.Int(nums[i]))
15+
//}
16+
//for i := 0; i < len(nums); i++ {
17+
// nums[i] = int(sortHeap.Extract().(heap.Int))
18+
//}
19+
20+
for i := (len(nums)-2) / 2; i >= 0; i-- {
21+
// 建立堆
22+
filterDown(i, len(nums)-1, nums)
23+
}
24+
for i := len(nums) - 1; i > 0; i-- {
25+
nums[i], nums[0] = nums[0], nums[i]
26+
// 不断调整为最大堆
27+
filterDown(0, i-1, nums)
1528
}
16-
for i := 0; i < len(nums); i++ {
17-
nums[i] = int(sortHeap.Extract().(heap.Int))
29+
}
30+
31+
// 堆的建立和调整
32+
func filterDown(current, last int, nums []int) {
33+
// child为current的子女位置
34+
child := 2 * current + 1
35+
// 暂存子树根结点
36+
temp := nums[current]
37+
// 判断是否到最后结尾
38+
for child <= last {
39+
if child < last && nums[child] < nums[child+1] {
40+
// 让child指向两个孩子中的最大的
41+
child ++
42+
}
43+
// temp的关键码大则不作调整
44+
if temp >= nums[child] {
45+
break
46+
} else {
47+
// 否则孩子中大者上移
48+
nums[current] = nums[child]
49+
current = child
50+
child = 2 * child + 1
51+
}
1852
}
53+
nums[current] = temp
1954
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/19 10:54
5+
*/
6+
7+
package main
8+
9+
import (
10+
"fmt"
11+
"Golang_Algorithm/Algorithm/Sort/Merge_Sort"
12+
)
13+
14+
func main() {
15+
testArray := []int{4, 2, 6, 7, 9, 5, 1, 3}
16+
Merge_Sort.Merge_Sort(testArray)
17+
fmt.Println(testArray)
18+
}

Algorithm/Sort/Merge_Sort/merge_sort.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,53 @@
55
*/
66

77
package Merge_Sort
8+
9+
// 合并数组
10+
func merge(sourceArr []int, tempArr []int, left, middle, right int) {
11+
i := left
12+
j := middle + 1
13+
k := left
14+
15+
for i != middle + 1 && j != right + 1 {
16+
if sourceArr[i] >= sourceArr[j] {
17+
tempArr[k] = sourceArr[j]
18+
k ++
19+
j ++
20+
} else {
21+
tempArr[k] = sourceArr[i]
22+
k ++
23+
i ++
24+
}
25+
}
26+
for i != middle + 1 {
27+
tempArr[k] = sourceArr[i]
28+
k ++
29+
i ++
30+
}
31+
for j != right + 1 {
32+
tempArr[k] = sourceArr[j]
33+
k ++
34+
j ++
35+
}
36+
for i = left; i <= right; i++ {
37+
sourceArr[i] = tempArr[i]
38+
}
39+
}
40+
41+
// 内部递归
42+
func recurse(sourceArr, tempArr []int, left, right int) {
43+
var middle int
44+
if left < right {
45+
middle = (left + right) / 2
46+
recurse(sourceArr, tempArr, left, middle)
47+
recurse(sourceArr, tempArr, middle+1, right)
48+
merge(sourceArr, tempArr, left, middle, right)
49+
}
50+
}
51+
52+
func Merge_Sort(nums []int) {
53+
left := 0
54+
right := len(nums) - 1
55+
var tempArr = make([]int, len(nums))
56+
recurse(nums, tempArr, left, right)
57+
}

Algorithm/Sort/Quick_Sort/main/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
func main() {
1515
testArray := []int{4, 2, 6, 7, 9, 5, 1, 3}
16+
//Quick_Sort.Quick_Sort_Recurse(testArray)
1617
Quick_Sort.Quick_Sort_Unrecurse(testArray)
1718
fmt.Println(testArray)
1819
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/19 11:13
5+
*/
6+
7+
package Radix_Sort
8+
9+
// 取一个数字从低到高第pos位的位数
10+
func getNumInPos(num, pos int) int {
11+
temp := 1
12+
for i := 0; i < pos - 1; i++ {
13+
temp *= 10
14+
}
15+
return (num / temp) % 10
16+
}
17+
18+
// 取一个数字的位数
19+
func getDigt(num int) int {
20+
n := 0
21+
for num > 0 {
22+
n ++
23+
num /= 10
24+
}
25+
return n
26+
}
27+
28+
// 基数排序
29+
func Radix_Sort(nums []int, max int) {
30+
// 获取待排序数的最大数位数
31+
digitRandom := getDigt(max)
32+
// 数组对应0-9序列
33+
//length := len(nums) + 1
34+
//var radixArray [10][len(nums) + 1]int
35+
radixArray := [10]([]int){}
36+
// index为0处记录这组数据的个数
37+
for i := 0; i < 10; i++ {
38+
radixArray[i] = make([]int, len(nums)+1)
39+
radixArray[i][0] = 0
40+
}
41+
for pos := 1; pos <= digitRandom; pos++ {
42+
// 分配过程
43+
for i := 0; i < len(nums); i++ {
44+
num := getNumInPos(nums[i], pos)
45+
radixArray[num][0] ++
46+
index := radixArray[num][0]
47+
radixArray[num][index] = nums[i]
48+
}
49+
// 收集
50+
j := 0
51+
for i := 0; i < 10; i++ {
52+
for k := 1; k <= radixArray[i][0]; k++ {
53+
nums[j] = radixArray[i][k]
54+
j ++
55+
}
56+
// 复位
57+
radixArray[i][0] = 0
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)