Golang的排序和查找

本文主要介绍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 \n",searchName,index)
            break
        }else if index == (len(Names)-1){
            fmt.Printf("没有找到%v \n",searchName)
        }
    }

    //顺序查找:第二种方式(推荐)
    index2 := -1
    for i := 0;i<len(Names);i++{
        if searchName == Names[i]{
            index2 = i
            break
        }
    }

    if index2 != -1{
        fmt.Printf("找到%v,下标%v \n",searchName,index2)
    }else{
        fmt.Printf("没有找到%v \n",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 \n", 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

 

 

转载于:https://www.cnblogs.com/yinzhengjie/p/10549307.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值