Go语言最简化的快速排序代码 - 修正

本文分享了使用Go语言实现快速排序算法的经验,详细介绍了代码中遇到的Bug及其修复方法,包括switch-case的正确使用和for循环条件的调整。同时,提供了完整的排序程序示例,包括读取输入文件、调用排序算法和写入输出文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习Go时,发现Go可以将代码写得极其简单,下面是我实现的一个快速排序代码:
该代码发现一个Bug,由于GO语言的特性,switch, case后不会再往下执行,所以一定要加上fallthrough才行。还有就一开始的for i != j,应该改为:for i < j:

// Start from here:
package qsort

func quickSort(values []int, left, right int) {
	i, j := left, right
	for i < j {
		for values[j] >= values[left] && i < j {
			j--
		}
		for values[i] <= values[left] && i < j {
			i++
		}
		if i < j {
			values[i], values[j] = values[j], values[i]
		}
	}
	if i > left {
		values[left], values[i] = values[i], values[left]
	}
	switch {
		case i - 1 > left:
			quickSort(values, left, i - 1)
			fallthrough
		case right > i + 1:
			quickSort(values, i + 1, right)
	}
}
func QuickSort(values []int) {
	quickSort(values, 0, len(values) - 1)
}
// End here可以直接调用

# package build …

# package install

然后主程序如下,编译后可以用一个文件来放in and out file
命令行运行:

# sorter -i infile -o outfile -a qsort

就可以了。

package main

import (
	"flag"
	"fmt"
	"io"
	"os"
	"bufio"
	"strconv"
	"time"
	"algorithm/bubblesort"
	"algorithm/qsort"
)

var infile *string = flag.String("i", "infile", "File contains values for sorting")
var outfile *string = flag.String("o", "outfile", "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("Failed to create the output file ", 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 unsupported.")
		}
		t2 := time.Now()
		fmt.Println("The sorting process costs", t2.Sub(t1), "to complete.")
		writeValues(values, *outfile)
	} else {
		fmt.Println(err)
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值