例题
找出整数数组[5, 7, 3, 6, 8, 9, 4, 2]中的最大值和次最大值
朴素方法
扫描数组找出最大值,再扫描除最大值外的其他元素找出次最大值,一共需要进行2n-3次比较
锦标赛方法
两个数一组进行比较,小的淘汰,找出最大值所需的比较次数为n-1(n为数组长度);次最大值一定所有在与最大值进行过比较的元素中,例如例题中的7,4,8,再进行扫描即可找出次最大值,需要的比较次数为log2(n)-1;该方法一共需要进行n+log2(n)-2次比较
代码
package main
import (
"fmt"
"strconv"
"strings"
)
var nums = []int{5, 7, 3, 6, 8, 9, 4, 2}
func main() {
m1, m2 := FindNumMax1Max2(nums)
fmt.Printf("m1=%d, m2=%d\n", m1, m2)
}
// FindNumMax1Max2 返回数组中的最大值m1和次最大值m2
func FindNumMax1Max2(nums []int) (m1, m2 int) {
oddFlag := false //数组长度是否为奇数
lastNum := nums[len(nums)-1] //保存数组中最后一个数
if len(nums)%2 == 1 {