排序 是将一组数据,依指定的顺序进行排列的过程

常见排序方法

1. 内部排序//指将需要处理的所有数据都加载到"内存"进行排序 适合数据量较小时使用//包括"交换式排序法"、"选择式排序法"和"插入式排序法"2. 外部排序法//数据量过大,无法全部加载到内存重,需要借助外部存储进行排序//包括"合并排序法"和"直接合并排序法"

一、交换式排序法

交换式排序法属于内部排序法,是运用数据的值进行比较后,根据规则对数据位置进行交换以达到排序的目的

冒泡排序

冒泡排序意思是,通过排序序列从后向前(从下标较大的元素到下标小的元素) 依次比较相邻的元素的大小

如果发现前面的值小于后面的值则交换,使较小的元素逐渐从后面移到前面

案例

package mainimport "fmt"func main() {var varr [5]int = [5]int{24,69,80,57,13}fmt.Println(varr)for i := 0; i < len(varr) - 1; i++{var temp intif varr[i] > varr[i + 1] {  //当前面的值大于后面的值时,双方位置互换temp = varr[i + 1]varr[i+1] = varr[i]varr[i] = temp}}fmt.Println(varr)
}//循环对比值1和值2的大小,如果1比2大则互换
//第一轮24没69大    结果[24,69,80,57,13]
//第二轮69没80大    结果[24,69,80,57,13]
//第三轮80比57大    结果[24,69,57,80,13]
//第四轮80比13大    结果[24,69,57,13,80]

返回

[24 69 80 57 13]    #原先的值
[24 69 57 13 80]    #排序后的值

上面我们只是将没对值进行了一个对比置换,但如果想要将所有的进行对比,还要加点东西

package mainimport "fmt"func main() {var varr [5]int = [5]int{24,69,80,57,13}//上面已经实现了把最大值提取出来,我们只需要让这个操作重复几次即可//下面我们设置了循环次数是数组的长度//这样,当循环完第一次后,得到[24 69 57 13 80]//第二次循环[24 57 13 69 80] 依次类推for j := 1; j < len(varr);j++ {for i := 0; i < len(varr)-1; i++ {var temp intif varr[i] > varr[i+1] {temp = varr[i+1]varr[i+1] = varr[i]varr[i] = temp}}}fmt.Println(varr)}

为了方便重复去调用这个功能,我们将他写成一个单独的函数

package mainimport "fmt"func bubblesort(varr *[5]int) {     //前面我们学习了指针的概念,如果想要在一个函数中操作其他函数中的变量就需要指针//指针数据只能接收内存地址,并且传入的值的类型必须一直//这里使用  varr *[*]int  说明我们需要接收内存地址的对象必须也是一个int数组temp := 0for i :=0; i < len(*varr) - 1 ; i++{       //在函数中调用需要带上星号"*"for j := 0; j < len(*varr) -1 -i; j++{if (*varr)[j] > (*varr)[j + 1]{temp = (*varr)[j](*varr)[j] = (*varr)[j + 1](*varr)[j + 1] =temp}}}
}
func main() {var varr [5]int = [5]int{24,69,80,57,13}bubblesort(&varr)      //通过& 将varr这个数组的内存地址传入到bubblesort函数中,使用指针接收fmt.Println(varr)}

其他排序方法参考文档

https://www.cnblogs.com/traditional/p/14624541.html

二、数组查询

1、顺序查找

案例1 使用for循环查询

/*思路1. 定义一个数组 (白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王)2. 从控制台接收一个名称,依次比较,如果发现有,则提示相应信息
*/package mainimport ("fmt"
)func main(){names := [4]string{"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"}var heroName = ""fmt.Println("清输入要查找的人名...")fmt.Scanln(&heroName)for i :=0; i < len(names); i++ {if heroName == names[i] {fmt.Printf("找到%v,下标%v",heroName,i)break} else if i == len(names) -1 {//这里的i 等于长度减一,说明到了最后一个元素了,就直接提示没有找到fmt.Printf("没有找到%v",heroName)}}
}

返回

清输入要查找的人名...
金毛狮王
找到金毛狮王,下标1

案例2

package mainimport ("fmt"
)func main(){names := [4]string{"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"}var heroName = ""fmt.Println("清输入要查找的人名...")fmt.Scanln(&heroName)//修改为如下index := -1                        //设置索引位的默认值为-1for i :=0; i < len(names); i++ {if heroName == names[i] {//fmt.Printf("找到%v,下标%v",heroName,i)index = i           //当可以找到时,给index赋值索引位break} }if index != -1{    //当for结束后判断index是否不为-1,如果不为-1则有值输出即可,fmt.Printf("找到%v 下标%v \n", heroName,index)}else{fmt.Printf("没有找到%v", heroName)}}

2、 二分查找

要求

请对一个有序数组进行二分查找  {1,8,10,89,1000,1234}
输入一个数看看该数组是否存在此数,并求出对应下标,如果没有则提示没有这个数(递归)

二分查找的思路

二分查找的前提, 他必须是一个有序的数组。总的来说,就是先找到数组最中间的值(middle)

然后拿着这个值去和你要查询的值(findvar)去对比,通常来说,对比会出现3种结果,如下

1、中间的值(middle)  比查询的值(findvar)大当中间的值大于查询的值,那么他会从开头到中间的索引位再取一个中间值去对比,重复这个操作2、中间的值(middle)  比查询的值(findvar)小当中间的值小于查询的值,那么他会以中间到结尾的索引位再取一个中间值去对比,重复这个操作3、中间的值(middle)  等于查询的值(findvar)如果等于 那么就匹配到了

案例

package main
import("fmt"
)func BinaryFind(arr *[6]int, leftIndex int, rightIndex int, findVal int){if leftIndex > rightIndex{       //两边的索引是一直在向中间靠拢的,到最后找不到时,左面索引的值会比右边大fmt.Println("找不到")     //就说明没有该数据,程序终止return}middle := (leftIndex + rightIndex) / 2     //将起始索引到终止索引相加得到剩余位置的最大值,然后除以2获取中间的索引if (*arr)[middle] > findVal{//当拿出的值大于你查询的值,说明你查询的值在当前索引的左面,右面索引都可以排除了BinaryFind(arr, leftIndex, middle -1, findVal)//再次查询,传入的最大值是值是从middle-1,表示下次查询的范围是0-中间值的范围} else if (*arr)[middle] < findVal {//第二种情况,拿到索引的值比你查询的要小,说明值在右边,同上BinaryFind(arr, middle + 1, rightIndex, findVal)} else {                                    //第三种情况,等于,那么就不计算了之间输出fmt.Printf("找到了,下标位%v\n",middle)}
}func main(){arr := [6]int{1, 8, 10, 89, 1000, 1234}findVal := 8   //要查询的值BinaryFind(&arr, 0, len(arr) - 1, findVal) //在调用时传入数组、起始索引值、最大索引值、要查询的值
}

返回

找到了,下标位1

Golang学习(十五) 数组排序和二分查找相关推荐

  1. OpenGL入门学习(十五)

    OpenGL入门学习[十五] 这次讲的所有内容都装在一个立方体中,呵呵. 呵呵,绘制一个立方体,简单呀,我们学了第一课第二课,早就会了. 先别着急,立方体是很简单,但是这里只是拿立方体做一个例子,来说 ...

  2. OpenCV与图像处理学习十五——LBP纹理特征(含代码)

    OpenCV与图像处理学习十五--LBP纹理特征(含代码) 一.LBP介绍 二.LBP原理 三.代码应用 一.LBP介绍 LBP(Local Binary Pattern, 局部二值模式) , 是一种 ...

  3. PyTorch框架学习十五——可视化工具TensorBoard

    PyTorch框架学习十五--可视化工具TensorBoard 一.TensorBoard简介 二.TensorBoard安装及测试 三.TensorBoard的使用 1.add_scalar() 2 ...

  4. C++学习 十五、类继承(1)基类,派生类,访问权限,protected

    C++学习 十五.类继承(1)基类,派生类 前言 类继承 类的关系与继承 基类, 派生类 基类 派生类 构造函数,析构函数 文件位置 访问权限 protected 后记 前言 本篇开始学习C++类的继 ...

  5. Linux学习十五 DNS基础服务

    Linux学习十五 DNS基础服务 DNS服务基础 BIND 伯利克Internet 域名服务 主要执行程序:/usr/sbin/named 系统服务:named 默认端口: TCP/UDP 53 主 ...

  6. 强化学习(十五) A3C

    在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Adv ...

  7. python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例

    文章目录 二分查找 线性查找 插入排序 快速排序 选择排序 冒泡排序 归并排序 堆排序 推荐代码一 推荐代码二 希尔排序 拓扑排序 说明:本篇博文的知识点大部分来自 Python3 实例 二分查找 二 ...

  8. 算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了

    最近发现了个好东西,就是一个学算法的好东西,是网易公开课的一个视频. 直通车 这是麻省理工学院的公开课,有中英字幕,感谢网易.. 也可以在App把视频缓存下来之后再放到电脑上面看,因为我这样可以倍速, ...

  9. 第十九章:二分查找和二分答案

    二分查找 二分的思想在程序设计中有着广泛的应用,例如,排序算法中的快速排序.归并排序,数据结构中的二叉树.堆.线段树等.二分是一种常用且高效的算法,它的基本用途是在单调序列中进行查找和判定操作. 二分 ...

最新文章

  1. LeetCode简单题之矩阵对角线元素的和
  2. 谷歌发布新编程语言,专治SQL各种“不服”
  3. 【js】indexOf()
  4. Vue.js-localhost:8080-无法显示此网页-【已经初始化的项目,如何再次在服务器上运行?】
  5. [转]计算机学习道路
  6. 现代软件工程的《构建之法》
  7. python三引号解析_[宜配屋]听图阁
  8. C++跳过(忽略)指定字符
  9. git不同的平台配置不同的公钥秘钥(git配置多个公钥秘钥)(git不同的项目配置不同的公钥秘钥)
  10. SpringBoot集成Jsoup爬虫——三级列表
  11. python下载pandas库镜像_下载pandas库
  12. 如何在excel中完成 双纵坐标 柱状图的绘制 (柱子重叠的解决方法)
  13. 【华为机试真题 JAVA】勾股数元组-100
  14. 152. 精读《recoil》
  15. 偿还技术债 - 通过重构拯救老代码
  16. VUE组件注册与基础用法
  17. STM32L431 MCU温度计算
  18. The installation cannot continue as the installer file may be damaged. Download the installer file a
  19. 茶学领域如何用的上计算机,计算机视觉图像处理技术在茶学领域应用分析
  20. 上海有计算机专业的二本大学排名及分数线,上海二本大学排名及分数线

热门文章

  1. html设置只在最后一页显示页脚,在Word里怎么设置页脚只在最后一页显示?
  2. java集成阿里大于第三方平台发送短信验证码
  3. 双十一,美团为何静悄悄?
  4. python工具方法 10 h5py批量写入文件、读取文件,支持任意维度的数据
  5. 小米盒子 刷系统 参考方法
  6. 空间注意力 通道注意力_注意力发生了什么变化?
  7. php todo和其他备注,帮助 | 高效ToDo
  8. 如何更好地理解中间件和洋葱模型
  9. 从零开始学习UCOSII操作系统13--系统移植理论篇
  10. 为什么mysql不建议执行超过3表以上的多表关联查询?