如何取出一个列表最大的前几位数,传统的做法是先对这个数组进行冒泡排序法,然后取出前几位即可。
但是冒泡排序最大的问题就是循环次数太多,有没有什么办法只循环一次就可以的呢。
如下这个代码就是只循环一次数组,就完成了判断。其实本质上也是冒泡排序,只是冒泡的,不是原始数组,而是存放最大值的数组。
什么意思,先看看代码:
package main import "fmt" func main() { fmt.Println("Hello, 世界") var maxNums [3]int var nums []int = []int{1, 123, 8, 9, 10, 2, 33, 1, 0, 2, 44, 91, 2, 12, 446, 8, 2, 34, 6, 228} for _, n := range nums { for i := 0; i < 3; i++ { if n > maxNums[i] { for l:=2; l > i; l-- { maxNums[l] = maxNums[l-1] } maxNums[i] = n //fmt.Println(i, "=>", n) break } } } fmt.Println(maxNums) }
也就是说,先定义一个存放最大值的数组列表,然后每次在需要往数组里面放最大值的时候,再对该数组进行冒泡排序,保证放进去的数字,都是按照大小排序的当前所知的最大数字。
* 这样和直接对原始数组进行冒泡排序有几个好处:
- 仅仅当需要进行冒泡排序的数字,才会进入冒泡排序循环,效率更高。
- 如果原始数据是某些列表对象,不需要在排序之前,把要排序的原始数据从列表对象中读取出来,节省了代码。