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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM