GO语言练习:第一个Go语言工程--排序

简介:

1、代码框架 /home/fengbo/sorter

复制代码
$ tree
.
├── bin
├── pkg
├── readme.txt
└── src
    ├── algorithms
    │   ├── bubblesort
    │   │   ├── bubblesort.go
    │   │   └── bubblesort_test.go
    │   └── qsort
    │       ├── qsort.go
    │       └── qsort_test.go
    └── sorter
        └── sorter.go
复制代码

  1.1、src/algorithms/bubblesort/bubblesort.go

复制代码
//bubblesort.go
package bubblesort

func BubbleSort(values []int) {
        flag := true

        for i := 0; i < len(values) - 1; i++ {
                flag = true

                for j := 0; j < len(values) - i - 1; j++ {
                        if values[j] > values[j + 1] {
                                values[j], values[j + 1] = values[j + 1], values[j]
                                flag = false
                        }
                        if flag == true {
                                break;
                        }
                }
        }
}
复制代码

  1.2、src/algorithms/bubblesort/bubblesort_test.go

复制代码
//bubble_test.ho
package bubblesort

import "testing"

func TestBubbleSort1(t * testing.T) {
        values := []int {5, 4, 3, 2, 1}
        BubbleSort(values)
        for i := 0; i < len(values) - 1; i++ {
                if values[i] > values[i + 1] {
                        t.Error("ubbleSort() faild. Got at ", values[i], values[i + 1])
                        break
                }
        }
}

func TestBubbleSort2(t * testing.T) {
        values := []int{5}
        BubbleSort(values)
        if(values[0] != 5) {
                t.Error("BubbleSort() faild. Got ", values, "Excepted 5")
        }
}
复制代码

  1.3、src/algorithms/qsort/qsort.go

复制代码
//qsort.go
package qsort

func quickSort(values []int, left, right int) {
        temp := values[left]
        p := left
        i, j := left, right

        for i <= j {
                for j >= p && values[j] >= temp {
                        j--
                }
                if j >= p {
                        values[p] = values[j]
                        p = j
                }
                if values[i] <= temp && i <= p {
                        i++
                }

                if i <= p {
                        values[p] = values[i]
                        p = i
                }
        }
        values[p] = temp
        if p - left > 1 {
                quickSort(values, left, p - 1)
        }
        if right - p > 1 {
                quickSort(values, p + 1, right)
        }
}

func QuickSort(values []int) {
        quickSort(values, 0 , len(values) - 1)
}
复制代码

  1.4、src/algorithms/qsort/qsort_test.go

复制代码
//qsort_test.go
package qsort

import "testing"

func TestQuickSort1(t * testing.T) {
        values := []int {5, 4, 3, 2, 1}
        QuickSort(values)
        var i int;
        var j int = len(values) - 1
        for i = 0; i < j; i++ {
                if values[i] > values[i + 1] {
                        t.Error("QuickSort() faild")
                        break;
                }
        }
}

func TestQuickSort2(t * testing.T) {
        values := []int {5}
        QuickSort(values)
        if values[0] != 5 {
                t.Error("QuickSort() faild. Got", values);
        }
}
复制代码

  1.5、src/sorter/sorter.go

复制代码
package main

import "bufio"
import "flag"
import "fmt"
import "io"
import "os"
import "strconv"
import "time"

import "algorithms/bubblesort"
import "algorithms/qsort"

var infile              * string = flag.String("i", "unsorted.dat"      , "File contains values for sorting")
var outfile             * string = flag.String("o", "sorted.dat"        , "File to receive sorted values")
var algorithm   * string = flag.String("a", "qsort"                     , "Sort algorithm")

func readValues(infile string)(values []int, err error){
        file, err := os.Open(infile)
        if err != nil{
                fmt.Println("Failed to open the input file :", infile)
                return
        }
        defer file.Close()

        br := bufio.NewReader(file)

        values = make([]int, 0)

        for{
                line, isPrefix, err1 := br.ReadLine()

                if err1 != nil{
                        if err1 != io.EOF{
                                err = err1
                        }
                        break
                }
                if isPrefix {
                        fmt.Println("A too long line, seems unexpected.")
                        return
                }

                str := string(line)

                value, err1 := strconv.Atoi(str)

                if err1 != nil{
                        err = err1
                        return
                }

                values = append(values, value)
        }
        return
}

func writeValues(values []int, outfile string) error {
        file, err := os.Create(outfile)
        if err != nil {
                fmt.Println("Faild to create the outfile ", outfile)
                return err
        }

        defer file.Close()

        for _, value := range values {
                str := strconv.Itoa(value)
                file.WriteString(str + "\n")
        }

        return nil
}

func main(){
        flag.Parse()

        if infile != nil {
                fmt.Println("infile =", *infile, "outfile = ", *outfile, "algorithm = ", *algorithm)
        }

        values, err := readValues(*infile)

        if err == nil {
                t1 := time.Now()
                switch *algorithm {
                case "qsort" :
                        qsort.QuickSort(values)
                case "bubblesort" :
                        bubblesort.BubbleSort(values)
                        default :
                        fmt.Println("Sorting algorithm", * algorithm, "is either unknown or ensupported.")
                }
                t2 := time.Now()

                fmt.Println("The sorting process costs", t2.Sub(t1), "to complete.")
                writeValues(values, * outfile)
        }else {
                fmt.Println(err)
        }
}
复制代码

2、编译

  2.1、设置环境变量

[fengbo@sorter]$ pwd
/home/fengbo/sorter
[fengbo@sorter]$ export GOPATH="/home/fengbo/sorter"

  2.1编译级安装

复制代码
$ go build algorithms/bubblesort
$ go build algorithms/qsort
$ go install algorithms/bubblesort
$ go install algorithms/qsort
$ go build sorter
复制代码

  2.2、编译及安装后的目录结构

复制代码
$ tree
.
├── bin
├── pkg
│   └── linux_386
│       └── algorithms
│           ├── bubblesort.a
│           └── qsort.a
├── readme.txt
├── sorter
└── src
    ├── algorithms
    │   ├── bubblesort
    │   │   ├── bubblesort.go
    │   │   └── bubblesort_test.go
    │   └── qsort
    │       ├── qsort.go
    │       └── qsort_test.go
    └── sorter
        └── sorter.go
复制代码

 


3、运行

  3.1、未排序的文本文件

复制代码
$ cat unsorted.dat
6
345
76564
5
66
443654
757
2365
565
复制代码

  3.2、运行排序程序

$ ./sorter -i unsorted.dat -o sorted.dat -a qsort
infile = unsorted.dat outfile =  sorted.dat algorithm =  qsort
The sorting process costs 2.22us to complete.

  3.3、排序后的结果文件

复制代码
$ ls
sorted.dat  sorter unsorted.dat
$ cat sorted.dat
5
6
66
345
565
757
2365
76564
443654
复制代码

4、注释

  代码来源于《Go语言编程》一书的第二章,目录结构与原书有些差异。

 


本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4620644.html,如需转载请自行联系原作者


相关文章
|
12月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1698 162
|
11月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
724 4
|
11月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
475 2
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
695 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
522 0
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
558 0
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
1536 0
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
735 1

热门文章

最新文章