作业: 实现func sort(s []int)

对长度为n的随机数列进行升序排序


7.3.1 冒泡排序

找到第1大的数,并移至第n位

找到第2大的数,并移至第n-1位

找到第x大的数,并移至第n-(x-1)位

依次比较,如果顺序不对则互换

对比次数,(n-1)+(n-2)…2+1 = (n2-n)/2

时间复杂度: O(n2)


7.3.2 选择排序

可以看作是冒泡排序的改良,减少了对数列操作次数

找到第1大的数,并移至第n位

找到第2大的数,并移至第n-1位

找到第x大的数,并移至第n-(x-1)位

先假设最后一位已经是最大值

依次比较,如果发现更大值则记录下标

比较后更大值与最后一位替换

对比次数,(n-1)+(n-2)…2+1 = (n2-n)/2

时间复杂度: O(n2)


7.3.3 插入排序

适合将数据插入在已经有序的数列中

依次与更靠前的值进行对比

如果小于前面的值则进行插入

如果大于前面的值则停止对比


对比次数: 取决于有序程度,最多1+2…(n-2)+(n-1) = (n2-n)/2

时间复杂度: O(n2)


7.3.4 快速排序

假设一个数为中位数

将比它小的数移到他的左面

将比它大的数移到他的右面

使用递归对左半和右半如法炮制(每次递归问题规模缩小一半)

时间复杂度: 取决于运气,O(n log n)~ O(n2)

7.4.1 对常见类型进行排序

7.4.2 自定义排序

7.4.3 自定义查找

7.4.4 sort.Interface

sort定义的接口,要求实现Len() int, Less(i, j int) bool, Swap(i, j int)方法

*这三个类型额外提供了Search(x) int和Sort()方法