Skip to content

Commit 61a13b7

Browse files
committed
2017.4.18
一些常见的排序算法
1 parent f631d62 commit 61a13b7

File tree

11 files changed

+283
-0
lines changed

11 files changed

+283
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 14:36
5+
*/
6+
7+
package Binary_Insert_Sort
8+
9+
func Binary_Insert_Sort(nums []int) {
10+
var insertNum int
11+
var middle int
12+
for i := 0; i < len(nums); i++ {
13+
insertNum = nums[i]
14+
left := 0 // 已排序数组左边界
15+
right := i - 1 // 已排序数组右边界
16+
for left <= right { // 二分法寻找插入位置
17+
middle = (left + right) / 2
18+
if insertNum > nums[middle] {
19+
left = middle + 1
20+
} else {
21+
right = middle - 1
22+
}
23+
}
24+
for j := i; i > left ; j-- {
25+
nums[j] = nums[j-1]
26+
}
27+
nums[left] = insertNum
28+
}
29+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 15:28
5+
*/
6+
7+
package Bubble_Sort
8+
9+
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]
16+
}
17+
}
18+
if swap == false {
19+
break
20+
}
21+
}
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 17:19
5+
*/
6+
7+
package Heap_Sort
8+
9+
import "Golang_Algorithm/Data_Structure/Heap"
10+
11+
func Heap_Sort(nums []int) {
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+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 14:40
5+
*/
6+
7+
package Insert_Sort
8+
9+
func InsertSort(nums []int) {
10+
var insertNum int
11+
for i := 1; i < len(nums); i++ {
12+
insertNum = nums[i] // 待插入的元素
13+
j := i - 1
14+
for j >= 0 && insertNum < nums[j] {
15+
nums[j+1] = nums[j]
16+
j --
17+
}
18+
nums[j+1] = insertNum
19+
}
20+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 17:26
5+
*/
6+
7+
package Merge_Sort
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/18 17:18
5+
*/
6+
7+
package main
8+
9+
import (
10+
"Golang_Algorithm/Algorithm/Sort/Quick_Sort"
11+
"fmt"
12+
)
13+
14+
func main() {
15+
testArray := []int{4, 2, 6, 7, 9, 5, 1, 3}
16+
Quick_Sort.Quick_Sort_Unrecurse(testArray)
17+
fmt.Println(testArray)
18+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 17:15
5+
*/
6+
7+
package Quick_Sort
8+
9+
func Quick_Sort_Recurse(nums []int) {
10+
left := 0
11+
right := len(nums) - 1
12+
sort(nums, left, right)
13+
}
14+
15+
func sort(nums []int, left int, right int) {
16+
if left < right {
17+
i := left
18+
j := right
19+
flag := nums[left]
20+
21+
for i < j {
22+
// 从右向左找第一个比基数小的元素
23+
for i < j && nums[j] >= flag {
24+
j --
25+
}
26+
nums[i] = nums[j]
27+
28+
// 从左向右找第一个比基数大的元素
29+
for i < j && nums[i] < flag {
30+
i ++
31+
}
32+
nums[j] = nums[i]
33+
}
34+
nums[i] = flag
35+
sort(nums, left, i-1)
36+
sort(nums, i+1, right)
37+
}
38+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 17:07
5+
*/
6+
7+
package Quick_Sort
8+
9+
import "Golang_Algorithm/Data_Structure/Stack"
10+
11+
func partition(nums []int, left int, right int) int {
12+
// 选第一个元素作为枢纽元
13+
flag := nums[left]
14+
for left < right {
15+
// 从右向左找到第一个小于flag的元素,放到left位置
16+
for left < right && nums[right] >= flag {
17+
right --
18+
}
19+
nums[left] = nums[right]
20+
21+
// 从左向右找到第一个大于flag的元素,放到right位置
22+
for left < right && nums[left] <= flag {
23+
left ++
24+
}
25+
nums[right] = nums[left]
26+
}
27+
nums[left] = flag
28+
return left
29+
}
30+
31+
func Quick_Sort_Unrecurse(nums []int) {
32+
sort_stack := Stack.New()
33+
left := 0
34+
right := len(nums) - 1
35+
if left < right {
36+
sort_stack.Push(left)
37+
sort_stack.Push(right)
38+
for sort_stack.IsEmpty() == false {
39+
j := sort_stack.Top().(int)
40+
sort_stack.Pop()
41+
i := sort_stack.Top().(int)
42+
sort_stack.Pop()
43+
k := partition(nums, i, j)
44+
if i < k - 1 {
45+
sort_stack.Push(i)
46+
sort_stack.Push(k-1)
47+
}
48+
if k + 1 < j {
49+
sort_stack.Push(k+1)
50+
sort_stack.Push(j)
51+
}
52+
}
53+
}
54+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 15:09
5+
*/
6+
7+
package Select_Sort
8+
9+
func Select_Sort(nums []int) {
10+
for i := 0; i < len(nums); i++ {
11+
for j := i + 1; j < len(nums); j++ {
12+
if nums[j] < nums[i] {
13+
nums[i], nums[j] = nums[j], nums[i]
14+
}
15+
}
16+
}
17+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Author: Juntaran
3+
* Email: Jacinthmail@gmail.com
4+
* Date: 2017/4/18 15:35
5+
*/
6+
7+
package Shaker_Sort
8+
9+
// 鸡尾酒排序,也就是双向冒泡
10+
func Shaker_Sort(nums []int) {
11+
left := 0
12+
right := len(nums) - 1
13+
var flag int // 左右有序标志位
14+
15+
for left < right {
16+
// 从左向右冒泡
17+
for i := left; i < right; i++ {
18+
if nums[i] > nums[i+1] {
19+
nums[i], nums[i+1] = nums[i+1], nums[i]
20+
flag = i
21+
}
22+
}
23+
right = flag
24+
// 从右向左冒泡
25+
for j := right; j > left; j-- {
26+
if nums[j] < nums[j-1] {
27+
nums[j-1], nums[j] = nums[j], nums[j-1]
28+
flag = j
29+
}
30+
}
31+
left = flag
32+
}
33+
}

0 commit comments

Comments
 (0)