• Golang的排序和查找


                    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 }
    bubbling.go

     

    三.查找

    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)
        }
    }
    sequential.go

    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)
    }
    binarySearch.go

     

  • 相关阅读:
    2015年终总结
    拉格朗日插值编程实现
    dlib库使用
    semi-global matching 算法总结
    为什么有的程序在64位机上跑反而比32位机更慢
    编译并使用带有OpenCL模块的OpenCV for android SDK
    Android OpenGL ES 离屏渲染(offscreen render)
    Django的安装和项目的启动
    实现单例模式的几种方法
    基本数据结构----队列
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10549307.html
Copyright © 2020-2023  润新知