通过Golang实现对应的选择排序,以加深对应的逻辑理解
原理剖析:
选择排序(Selection Sort)是一种简单直观的排序算法,其主要思想是反复从未排序部分选择最小或最大的元素,将其放到已排序部分的末尾。选择排序不需要额外的空间,属于原地排序算法。下面详细讲解选择排序的原理。
选择排序的步骤:
选择排序的主要步骤包括:
- 找到最小值:在未排序的部分中找到最小的元素。
- 交换位置:将这个最小的元素与未排序部分的第一个元素交换位置,从而使得该最小元素进入已排序部分。
- 重复上述步骤:对于剩下的未排序部分,继续执行上述操作,直到所有元素都排序完毕。
1.定义一个回调函数类型
通过对应的回调函数实现判断是否需要交换
type compare func(a interface{}, b interface{}) bool//定义一个回调函数类型
2.开始编写对应的函数(详见注释)
// 选择排序
func SelectionSort(arr []interface{}, op compare) {
// 遍历数组,i 是当前排序部分的最后一个元素索引
for i := 0; i < len(arr)-1; i++ {
minIndex := i // 假设当前 i 是未排序部分的最小值
// 从 i+1 开始遍历剩余未排序部分,寻找最小值
for j := i + 1; j < len(arr); j++ {
if op(arr[j], arr[minIndex]) { // 如果找到更小的值,更新最小值索引
minIndex = j
}
}
// 如果最小值索引发生变化,交换元素
if minIndex != i {
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}
}
3.调用测试
type Person struct {
Name string
Age int
}
func (p Person)String()string{
return fmt.Sprintf("Name: %s, Age: %d",p.Name,p.Age)
}
func compare(a interface{}, b interface{}) bool {
return a.(Person).Age < b.(Person).Age
}
func main() {
arrays := []interface{}{
Person{Name:"A", Age:11},
Person{Name:"B", Age:12},
Person{Name:"C", Age:22},
Person{Name:"D", Age:67},
Person{Name:"E", Age:100},
}
fmt.Println("Before Sorting")
for _,v := range arrays{
fmt.Println(v)
}
api.SelectionSort(arrays,compare)
fmt.Println("After Sorting")
for _,v := range arrays{
fmt.Println(v)
}
}
4.呈现结果
Before Sorting
Name: A, Age: 11
Name: B, Age: 12
Name: C, Age: 22
Name: D, Age: 67
Name: E, Age: 100
After Sorting
Name: A, Age: 11
Name: B, Age: 12
Name: C, Age: 22
Name: D, Age: 67
Name: E, Age: 100