這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
今天閑來無事看了下GO語言,首先是看了酷殼耗子大牛的文章,然後下載安裝,配置環境等等,由於我下載的是安裝版,所以環境變數什麼的不用自己配置。然後又剛好去圖書館借了兩本書:《Go語言編程》許式偉/呂桂華編著,《Go語言 雲動力》樊虹編著,接著就開始看。。
好了,廢話不多說,直接進入主題:
在《Go語言編程》我看到他有一些例子,在書的第二章最後,講的是兩種排序的Go語言實現(快速排序和冒泡排序)本文的原始碼來自《Go語言編程》許式偉/呂桂華編著
排序本身不重要,因為之前用C,java也實現過,重要的是練練寫Go語言,熟悉下文法。
環境:
我設定的GOPATH為:G:\go
然後所有檔案及目錄如下:
主程式(sorter.go):G:\go\src
排序演算法(bubblesort.go、qsort.go):G:\go\src\mysort (注意,這裡不能取名為sort否則後面執行 go install的時候會出錯)
測試類別(bubblesort_test.go、qsort_test.go):G:\src\sort_test (注意,測試類別必須以_test.go結尾,之前在_test.go結尾的檔案中編寫了main函數,然後果斷編譯出錯)
原始碼:
soter.go
package mainimport("flag""fmt""bufio""io""os""strconv""time""mysort")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 = err1return}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":mysort.QuickSort(values)case "bubblesort":mysort.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)}}
排序演算法:
bubblesort.go
package mysortfunc BubbleSort(values []int){flag := truefor i:=0;i < len(values)-1;i++{flag = truefor 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}// end if}//end for j=...if flag == true{break}}// end for i=...}
qsort.go
package mysortfunc quickSort(values []int,left,right int){temp:=values[left]p := lefti,j:=left,rightfor 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] = tempif 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)}
測試類別:
bubblesort_test.go
package sort_testimport ("mysort""testing")func TestBubbleSort1(t *testing.T){values := []int{5,4,3,2,1}mysort.BubbleSort(values)if values[0] != 1 || values[1] != 2 || values[2] != 3||values[3] != 4 || values[4] != 5{t.Error("BubbleSort() failed , Got",values,"Excepted 1 2 3 4 5")}}func TestBubbleSort2(t *testing.T){values := []int{5,5,3,2,1}mysort.BubbleSort(values)if values[0] != 1 || values[1] != 2 || values[2] != 3||values[3] != 5 || values[4] != 5{t.Error("BubbleSort() failed , Got",values,"Excepted 1 2 3 5 5")}}func TestBubbleSort3(t *testing.T){values := []int{5}mysort.BubbleSort(values)if values[0] != 5{t.Error("BubbleSort() failed , Got",values,"Excepted 5")}}
qsort_test.go
package sort_testimport("mysort""testing")func TestQuickSort1(t *testing.T){values:=[]int{5,4,3,2,1}mysort.QuickSort(values)if values[0] != 1 || values[1] != 2 || values[2] != 3||values[3] != 4 || values[4] != 5{t.Error("QuickSort() failed , Got",values,"Excepted 1 2 3 4 5")}}func TestQuickSort2(t *testing.T){values := []int{5,5,3,2,1}mysort.QuickSort(values)if values[0] != 1 || values[1] != 2 || values[2] != 3||values[3] != 5 || values[4] != 5{t.Error("QuickSort() failed , Got",values,"Excepted 1 2 3 5 5")}}func TestQuickSort3(t *testing.T){values := []int{5}mysort.QuickSort(values)if values[0] != 5{t.Error("QuickSort() failed , Got",values,"Excepted 5")}}
運行:首先是測試(以快速排序為例)
進入到G:\go\src\sort_test 目錄下
>cd /d G:\go\src\sort_test
>go install
>go build qsort_test.go
>go test qsort_test.go
如果代碼和GOPATH設定沒問題,那麼就會顯示OK
然後是運行主程式,在這之前,現在src目錄下建立一個檔案“unsorted.dat”,用記事本開啟然後輸入
123
3046
3
64
490
1
23
5331
2
7
4
2
132
儲存,接下來:
進入:G:\go\src下
>cd G:\go\src
>go build
然後會在src目錄下產生一個sorter.exe
命令列輸入(G:\go\src下):
sorter.exe -i unsorted.dat -o sorted.dat -a qsort(如果你是想運行冒泡排序這一行命令的最後一個單詞改為:bubblesort)
如果代碼和GOPATH配置沒有問題,那麼會在src目錄下產生一個sorted.dat,用記事本開啟可以發現一面的內容已經是排好序的
好,操作到此為止--------------------------------------------------------------------------------------------------------