func(c *card_sort)pop()int { if c.head.next == nil { return-1 } else { data := c.head.next.data.data c.head.next = c.head.next.next return data } }
“继承”链表的方法,添加从头取出节点的方法pop()
初始化桶函数
1 2 3 4 5 6 7 8
funcinitial_bucket() [10]*card_sort { bucket := [10]*card_sort{} new_data := link_table{table_node{table_data{}, nil}, 0} for i := 0; i < len(bucket); i++ { bucket[i] = &card_sort{new_data} } return bucket }
初始化一个尺寸为10的桶数组
获得基数函数
1 2 3
funcget_num(num int, data int)int { returnint(float64(data)/math.Pow(10, float64(num))) % 10 }
获取传入参数data的第num(从0开始计数)位数
入桶函数
1 2 3 4 5 6 7
funcin_bucket(data []int, num int) [10]*card_sort { bucket := initial_bucket() for i := range data { bucket[get_num(num, data[i])].append(table_data{data[i]}) } return bucket }
按顺序将切片带入的数据根据获得的基数送入对应的桶中
出桶函数
1 2 3 4 5 6 7 8 9 10 11 12 13
funcout_bucket(bucket [10]*card_sort) []int { temp := 0 data := []int{} for i := range bucket { temp = bucket[i].pop() for temp != -1 { data = append(data, temp) temp = bucket[i].pop() } } // fmt.Println(data) return data }
从桶0开始依次将桶中的数据取出放入一个切片中
一次桶排序函数
1 2 3 4
funccard_sort_step(bucket [10]*card_sort, num int) [10]*card_sort { data := out_bucket(bucket) return in_bucket(data, num) }
先出桶,后按给定的位数num入桶
桶排序函数
1 2 3 4 5 6 7
funccard_sort_eval(data []int, num int) []int { bucket := in_bucket(data, 0) for i := 1; i < num; i++ { bucket = card_sort_step(bucket, i) } return out_bucket(bucket) }
多项式ADT
使用表的方式可以描数单元的多项式(如果使用链表,则数据部分就是{系数,幂次数})
多项式链表结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14
type Table_data struct { coefficient int index int }
type table_node struct { data Table_data next *table_node }