作业: 实现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()方法