美文网首页Go语言自习室
第十三章:Go语言基础排序程序

第十三章:Go语言基础排序程序

作者: 楚江云 | 来源:发表于2019-11-02 18:10 被阅读0次
golang-gopher.png

程序需要实现的基础功能

  • 程序能从命令行读取命令,输入的数据文件,排序之后的输出文件,使用的排序算法
  • 读取文件中的数据
  • 调用指定的排序算法
  • 将排序之后的数据写入到输出文件中
  • 计算排序耗时

目录结构

|
|__sorter

|__bubbleSort

|____bubbleSort.go

|____bubbleSort_test.go

|__quickSort

|____quickSort.go

|____quickSort_test.go

|__main.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)-1-i; j++ {
            if values[j] > values[j+1] {
                values[j], values[j+1] = values[j+1], values[j]
                flag = false
            }
        }
        if flag == true {
            break
        }
    }
}

bubbleSort_test.go

package bubbleSort

import "testing"

// 单元测试1 冒泡排序
func TestBubbleSort1(t *testing.T) {
    values := []int{9, 8, 7, 6}
    BubbleSort(values)
    if values[0] != 6 || values[1] != 7 || values[2] != 8 || values[3] != 9 {
        t.Error("BubbleSort() failed", values)
    }
}
// 单元测试3
func TestBubbleSort2(t *testing.T) {
    values := []int{9, 7, 7, 6}
    BubbleSort(values)
    if values[0] != 6 || values[1] != 7 || values[2] != 7 || values[3] != 9 {
        t.Error("BubbleSort() failed", values)
    }
}
// 单元测试3
func TestBubbleSort3(t *testing.T) {
    values := []int{9}
    BubbleSort(values)
    if values[0] != 9 {
        t.Error("BubbleSort() failed", values)
    }
}

quickSort.go

package quickSort
// 快速排序
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
        }

        for i <= p && values[i] <= temp {
            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) {
    if len(values) <= 1 {
        return
    }
    quickSort(values, 0, len(values)-1)
}

quickSort_test.go

package quickSort

import "testing"
// 单元测试 快速排序
func TestQuickSort1(t *testing.T) {
    values := []int{9, 8, 7, 6}
    QuickSort(values)
    if values[0] != 6 || values[1] != 7 || values[2] != 8 || values[3] != 9 {
        t.Error("BubbleSort() failed", values)
    }
}
func TestQuickSort2(t *testing.T) {
    values := []int{9, 8, 8, 6}
    QuickSort(values)
    if values[0] != 6 || values[1] != 8 || values[2] != 8 || values[3] != 9 {
        t.Error("BubbleSort() failed", values)
    }
}
func TestQuickSort3(t *testing.T) {
    values := []int{6}
    QuickSort(values)
    if values[0] != 6 {
        t.Error("BubbleSort() failed", values)
    }
}

sorter.go

package main

import (
    "GoNote/chapter6/sorter/bubbleSort"
    "GoNote/chapter6/sorter/quickSort"
    "bufio"
    "flag"
    "fmt"
    "io"
    "os"
    "strconv"
    "time"
)

// 使用flag包接收命令行参数
var infile *string = flag.String("i", "infile", "file contents values for sorting")
var outfile *string = flag.String("o", "outfile", "file to receive values sorted values")
var algorithm *string = flag.String("a", "quick or bubble", "sort algorithm")

// 从文件中读取需要排序的内容,转为整型,添加到一个切片中
func readValues(infile string) (values []int, err error) {
    file, err := os.Open(infile)
    if err != nil {
        fmt.Println(err, 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)
        if str == "" {
            continue
        }
        value, err2 := strconv.Atoi(str)
        if err2 != nil {
            err = err2
            return
        }
        values = append(values, value)
    }
    return
}

// 将排序之后的数据写入文件中
func writeValue(values []int, outfile string) error {
    file, err := os.Create(outfile)
    if err != nil {
        return err
    }
    defer file.Close()
    for _, v := range values {
        str := strconv.Itoa(v)
        file.WriteString(str + "\n")
    }
    return nil
}

func main() {
    flag.Parse()
    if infile != nil {
        fmt.Println(*infile, *outfile, *algorithm)
    }
    values, err := readValues(*infile)
    if err == nil {
        start := time.Now()
        switch *algorithm {
        case "quick":
            quickSort.QuickSort(values)
        case "bubble":
            bubbleSort.BubbleSort(values)
        default:
            fmt.Println("sorting algorithm", *algorithm, "is unknow")
        }
        end := time.Now()
        fmt.Println("the program is cost : ", end.Sub(start), " to complete")
        writeValue(values, *outfile)
    } else {
        fmt.Println(err)
    }
}

通过如下命令执行程序

$ go run sorter.go -i in.txt -o out.txt -a bubble

相关文章

  • 第十三章:Go语言基础排序程序

    程序需要实现的基础功能 程序能从命令行读取命令,输入的数据文件,排序之后的输出文件,使用的排序算法读取文件中的数据...

  • go语言基础

    go语言基础 go 语言接口

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • Go语言基础语法--注释、基础结构2

    章节 GO语言基础语法--注释、基础结构(重要) 1.GO语言基础语法---注释、基础结构 基础结构注意事项 源文...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • 《Go语言四十二章经》第三十三章 Socket网络

    《Go语言四十二章经》第三十三章 Socket网络 作者:李骁 33.1 Socket基础知识 tcp/udp、i...

  • go基础

    go 语言基础知识汇总

  • Golang资料整理

    视频 郝林-Go语言第一课 Go编程基础 Go Web 基础 Go名库讲解 社区 官网要翻墙 Github--Go...

  • Go教程第十七篇: 介绍并发

    Go教程第十七篇: 介绍并发 本文是《Go系列教程》的第十七篇文章。 Go是一个并发语言而不是一个并行语言。在讨论...

  • 我的书单

    韩顺平go语言基础 -- 在读go语言实战 -- 在读大话数据结构 -- 在读高性能MySQL -...

网友评论

    本文标题:第十三章:Go语言基础排序程序

    本文链接:https://www.haomeiwen.com/subject/svrhbctx.html