通过编写一些简单的算法学习golang语言。
下面是插入排序算法golang语言的实现:
一般的写法:
package main
import "fmt"
func insertionSort(sortData []interface{}) []interface{} {
for index := 1; index < len(sortData); index++ {
key := sortData[index]
i := index - 1
for i >= 0 && compare(sortData[i], key) {
sortData[i+1] = sortData[i]
i = i - 1
}
sortData[i+1] = key
}
return sortData
}
func compare(l, r interface{}) bool {
value, err := compareValue(l, r)
if err == nil {
return value
}
return false
}
func compareValue(left, right interface{}) (bool, error) {
switch right := right.(type) {
default:
return false, fmt.Errorf("unexpected type %T\n", right)
case string:
switch left := left.(type) {
case string:
if left > right {
return true, nil
}
return false, nil
}
case int:
switch left := left.(type) {
case int:
if left > right {
return true, nil
}
return false, nil
}
}
return false, nil
}
func convertIntToInterface(is []int) []interface{} {
isc := make([]interface{}, len(is))
for i, d := range is {
isc[i] = d
}
return isc
}
func convertStringToInterface(is []string) []interface{} {
isc := make([]interface{}, len(is))
for i, d := range is {
isc[i] = d
}
return isc
}
func main() {
is := []int{3, 2, 6, 4, 5}
ss := []string{"azc", "asd", "bas", "bbc", "zxc"}
iss := insertionSort(convertIntToInterface(is))
sss := insertionSort(convertStringToInterface(ss))
fmt.Println(iss)
fmt.Println(sss)
}
golang语言sort包里面的写法:
package main
import "fmt"
// Interface copy from sort package
type Interface interface {
Len() int
Less(i, j int) bool
Swap(i, j int)
}
func insertSort(data Interface) {
for i := 1; i < data.Len(); i++ {
for j := i - 1; j >= 0 && data.Less(i, j); j-- {
data.Swap(i, j)
}
}
}
// IntSlice attaches the methods of Interface to []int, sorting in increasing order.
type IntSlice []int
func (p IntSlice) Len() int { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// InsertionSort is a convenience method.
func (p IntSlice) InsertionSort() { insertSort(p) }
// StringSlice attaches the methods of Interface to []string, sorting in increasing order.
type StringSlice []string
func (p StringSlice) Len() int { return len(p) }
func (p StringSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p StringSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
// InsertionSort is a convenience method.
func (p StringSlice) InsertionSort() { insertSort(p) }
func main() {
is := []int{3, 2, 6, 4, 5}
ss := []string{"azc", "asd", "bas", "bbc", "zxc"}
IntSlice(is).InsertionSort()
StringSlice(ss).InsertionSort()
fmt.Println(is)
fmt.Println(ss)
}