排序和查找
- 排序的基本介绍
- 交换式排序法
- 交换式排序法-冒泡排序
- 查找
- 顺序查找
- 二分查找
排序的基本介绍
排序是将一组数据,依指定的顺序进行排列的过程
排序的分类:
- 1.内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法,选择式排序法,插入式排序法)
- 2.外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法,直接合并排序法)
交换式排序法
交换式排序属于内部排序法,是运用数据值比较后,依判规则对数据位置进行交换,以达到排序的目的。
交换式排序法又可分为两种
1.冒泡排序法(bubble sort)
2.快速排序法(quick sort)
交换式排序法-冒泡排序
冒泡排序的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元向下标较小的单元),就像水底下的气泡一样逐渐向上冒。因为排序的过程中,个元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序的过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。
package main
import (
"fmt"
)
func BubbleSort(arr *[5]int) {
fmt.Println("排序前arr=", (*arr))
for i:= 0; i < len(*arr) - 1; i++{
for j := 0; j < 3; j++ {
if (*arr)[j] > (*arr)[j + 1] {
//交换
temp := (*arr)[j]
(*arr)[j] = (*arr)[j + 1]
(*arr)[j + 1] = temp
}
}
}
fmt.Println("排序后arr=", (*arr))
}
func main() {
arr := [5]int{12,45,89,64,58}
BubbleSort(&arr)
}
/*
排序前arr= [12 45 89 64 58]
排序后arr= [12 45 64 89 58]
*/
查找
在golang中常用的查找有两种
1.顺序查找
2.二分查找
顺序查找
package main
import (
"fmt"
)
func main() {
names := [4]string{"kun", "ikun", "kunkun", "heizi"}
var heroName = " "
fmt.Println("请选择你的英雄")
fmt.Scanln(&heroName)
//第一种方式
for i := 0; i < len(names); i++ {
if heroName == names[i] {
fmt.Printf("您的英雄是%v, 下标%v\n", heroName, i)
break
} else if i == (len(names) - 1){
fmt.Printf("没有找到%v\n", heroName)
}
}
//第二种方式
index := -1
for i := 0; i < len(names); i++{
if heroName == names[i] {
index = i //将找到的值对应的下标赋给index
break
}
}
if index != -1 {
fmr.Printf("你的英雄是%v, 下标%v \n", heroName, index)
} esle {
fmt.Printf("没有找到%v", heroName)
}
}
/*
请选择你的英雄
heizi
您的英雄是heizi, 下标3
请选择你的英雄
kunkunkun
没有找到kunkunkun
*/
二分查找
package main
import (
"fmt"
)
func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int){
//判断leftIndex是否大于rightIndex
if leftIndex > rightIndex {
fmt.Println("找不到")
return
}
//先找到中间的下标
middle := (leftIndex + rightIndex) / 2
if (*arr)[middle] > findVal {
//说明我们要查找的数,应该在 leftindex --- middle -1
BinaryFind(arr, leftIndex, middle - 1, findVal)
} else if (*arr)[middle] < findVal {
//说明我们要茶渣的数应该在middle + 1---rightindex
BinaryFind(arr, middle + 1 , rightIndex, findVal)
} else {
//找到了
fmt.Printf("找到了, 下标为%v \n", middle)
}
}
func main() {
arr := [6]int{1, 8, 10, 89, 1000, 1234}
//测试
BinaryFind(&arr, 0, len(arr) - 1, 1000)
}
//找到了, 下标为4