Golang的排序和查找
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.排序的基本介绍
排序是将一组数据,依指定的顺序进行排列的过程。排序的分类如下
1>.内部排序
指将需要处理的所有数据都家在到内存存储器中进行排序,其中包括交换式排序法,选择式排序法和插入式排序法。
2>.外部排序法
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序,其中包括合并排序法和直接合并排序法。
二.冒泡排序
1>.冒泡排序基本思想
通过对待排序序列从前向后(从下标较大的元素开始),一次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就像水底下的气泡一样逐渐向上冒。
因为排序过程的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较(优化)。
2>.代码实现
1 package main 2 3 import( 4 "fmt" 5 ) 6 7 func BubbleSort(arr *[8]int){ 8 fmt.Println("排序前arr=",(*arr)) 9 temp := 0 10 11 for i :=0;i<len(*arr) -1;i++{ 12 for j := 0;j<len(*arr)-1 -i;j++{ 13 if(*arr)[j] > (*arr)[j+1]{ 14 temp =(*arr)[j] 15 (*arr)[j] = (*arr)[j+1] 16 (*arr)[j+1] = temp 17 } 18 } 19 } 20 fmt.Println("排序后arr=",(*arr)) 21 } 22 23 24 func main(){ 25 arr := [8]int{14,51,32,98,24,118,35,26} 26 BubbleSort(&arr) 27 fmt.Println("main arr=",arr) 28 }
三.查找
1>.查找介绍
在Golang中,我们常用的查找有两种:顺序查找和二分查找(该数组是有序)。
2>.顺序查找案例
package main import ( "fmt" ) func main(){ Names := [5]string{"孙悟空","唐三藏","猪八戒","沙和尚","白龙马"} var searchName = "" fmt.Println("请输入要查找的人名>>>") fmt.Scanln(&searchName) //顺序查找:第一种方式 for index:=0;index<len(Names);index++{ if searchName == Names[index]{ fmt.Printf("找到%v,下标%v ",searchName,index) break }else if index == (len(Names)-1){ fmt.Printf("没有找到%v ",searchName) } } //顺序查找:第二种方式(推荐) index2 := -1 for i := 0;i<len(Names);i++{ if searchName == Names[i]{ index2 = i break } } if index2 != -1{ fmt.Printf("找到%v,下标%v ",searchName,index2) }else{ fmt.Printf("没有找到%v ",searchName) } }
3>.二分查找案例
请对一个有序数组进行二分查找{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192} ,输入一个数看看该数组是否存 在此数,并且求出下标,如果没有就提示"找不到"。
package main import ( "fmt" "strconv" ) func BinaryFind(arr *[14]int, leftIndex int, rightIndex int, findVal int) { //判断 leftIndex 是否大于 rightIndex if leftIndex > rightIndex { fmt.Println("找不到") return } //先找到 中间的下标 middle := (leftIndex + rightIndex) / 2 if (*arr)[middle] > findVal { //说明我们要查找的数,应该在 BinaryFind(arr, leftIndex, middle - 1, findVal) } else if (*arr)[middle] < findVal { //说明我们要查找的数,应该在 middel+1 --- rightIndex BinaryFind(arr, middle + 1, rightIndex, findVal) } else { //找到了 fmt.Printf("找到了,下标为%v ", middle) } } func main() { arr := [14]int{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192} var searchName = "" fmt.Println("请输入要查找的数字>>>") fmt.Scanln(&searchName) input,_ := strconv.Atoi(searchName) BinaryFind(&arr, 0, len(arr) -1, input) }