这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
排序
分类
内部排序、外部排序 稳定排序、不稳定排序
- 内部排序、外部排序
2. 内部排序是指整个排序过程完全在内存中进行,包括(交换式排序、选择式排序和插入式排序) 3. 由于数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,包括(合并排序法和直接合并排序法) - 稳定排序、不稳定排序
- 稳定排序:排序前后两个相等的数相对位置不变,则算法稳定
- 非稳定排序:排序前后两个相等的数相对位置发生了变化,则算法不稳定
交换排序
通过两两比较待排序记录的关键字,若有不满足次序要求的一对数据则交换,直到全部满足位置
1、冒泡排序
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
- 双层for循环实现,时间复杂度O(n^2),空间复杂度O(1)
func BubbleAsort(values []int) {
for i := 0; i < len(values)-1; i++ {
a := 0
for j := i+1; j < len(values); j++ {
if values[i]>values[j]{
values[i],values[j] = values[j],values[i] //和python一样直接交换
a = 1
}
}
if a ==0{
return
}
}
fmt.Println(values)
}
2、快速排序 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用
- 1.先从数列中取出一个数作为基准数。
- 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 3.再对左右区间重复第二步,直到各区间只有一个数。
查找
按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。
二分查找
在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
func BinaryFind(arr *[6]int,lef int,rig int,find int){
//数组是值传递,需要使用指针可以改变
//判断是否在数组的范围中
if lef > rig{
fmt.Println("找不到") //注意递归调用符合进站顺序,所以
return
}
middle := (lef + rig) /2
if(*arr)[middle] > find{
//大于要查找的数,此时应该向左边找
BinaryFind(arr,lef,middle - 1)
//注意,此时arr本身就是指针,所以不需要地址符
}else if (*arr)[middle] < find{
BinaryFind(arr,middle+1,rig)
}else{
//相等说明找到
fmt.Printf("找好了,下标为%v \n",middle)
}
}
func main(){
arr := [6]int{1,2,3,4,5,6,7,8,9}
BinaryFind(&arr,0,len(arr)-1,4)
}