golang_快速排序(TDD实践)_服务计算_作业二

完成迭代章节的练习

1.1修改测试代码,以便调用者可以指定字符重复的次数,然后修复代码

1:先修改测试代码;为迭代函数添加一个int 类型的参数:

package iteration

import "testing"
import  "fmt"
func TestReapeat(t *testing.T){
	repeated := Repeat("a",5)
	expected := "aaaaa"

	if repeated != expected{
		t.Errorf("expected '%q' but got '%q'",expected,repeated)
	}
}

尝试运行修改后的测试文件:编译器会报错,显示调用的函数Repeat()参数过多。

在这里插入图片描述
对函数Repeat()进行修改,使得它可以指明迭代的次数。

package iteration

func Repeat(character string,count int) string {
   var repeated string
   for  i := 0; i < count; i++{
	   repeated += character
   }
   return repeated
}

修改好代码后,再次运行测试:测试通过:

在这里插入图片描述

1.2:写一个 ExampleRepeat 来完善你的函数文档。

书写示例有点类似于测试;在测试文件下面添加如下函数,下面的注释//Output: aaaaa 不能省略,否则,实例函数不会执行;

func ExampleRepeate( ){
	exam_text := Repeat("a", 5)
	fmt.Println(exam_text)
	//Output:  aaaaa
}

运行测试;可以看到示例的结果:
在这里插入图片描述

2:模仿教程内容结构,写一个Go语言某算法实现TDD实践报告。

2.1先写测试代码:

在文件quick_sort_test.go下编写测试代码如下:

package quick_sort

import "testing"
//判断两个数组是否一样:返回一个整型  1:一样  0:不一样
func is_same(arr1[] int ,arr2 [] int) int{
	if(len(arr1)!=len(arr2)){   //长度不一样,数组不一样
		return 0
	}

	for i:= 0 ; i < len(arr1) ;  i ++ {   //逐个判断数组的值
		if arr1[i] != arr2 [i] {
			return 0
		}
	}

	return 1
}


func TestQ_sort(t *testing.T){
    //测试数组一:
	var test_arr1 = [] int {2,34,22,78,45,65,89,23,44,33}  
	//排列好的数组一;期望输出数组
	var expected1 = [] int {2,22,23,33,34,44,45,65,78,89}
	//测试数组二:
	var test_arr2 = [] int {35,75,81,25,95,47,74,21,44}
	//数组二的输出数组:
	var expected2 = [] int {21,25,35,44,47,74,75,81,95}
    //比较函数的输出与期望输出是否一致
	var sort_res1 = Q_sort(test_arr1, 0, len(test_arr1)-1)
	var sort_res2 = Q_sort(test_arr2, 0, len(test_arr2)-1)

    if  is_same(sort_res1, expected1) == 0{
		t.Errorf("expected '%v' but got '%v'",expected1,sort_res1)
	}
    if  is_same(sort_res2, expected2) == 0{
		t.Errorf("expected '%v' but got '%v'",expected2,sort_res2)
	}
}

2.2尝试运行测试

$ go test -v

运行失败,无法加载快排函数:

在这里插入图片描述

2.3 先使用最少的代码来让失败的测试先跑起来;

编写如下简单的代码,尽管它运行的测试是错误的,但是测试代码可以成功编译了。

func Q_sort(arr [] int ,begin int , rear int) [] int {
      return arr
}

运行结果:
在这里插入图片描述

2.4 编写完整的代码,使得它能够通过测试:

编写完整的快排代码:

package quick_sort

func Q_sort_part(arr [] int ,begin int ,rear int) int{
	key :=arr[begin]  //取出数组开头的一个值为中间值
	at_arr := begin +1  //当前处理的数值位置
	sm_rear := begin+1  //比键值小的队列的下一个位置

	for ;at_arr <= rear ; at_arr++ {  //按序扫描数组块,
		    //如果当前位置的数值小于键值,则与大数数列的首个数字交换位置
		if  arr[at_arr]  < key     {
		  temp := arr[at_arr]      //arr[at_arr]与arr[sm_rear]交换位置
		  arr[at_arr] = arr[sm_rear]
		  arr[sm_rear] = temp
		  sm_rear++;
		}
	}
//将键值放到中间位置
	temp1 := arr[sm_rear-1]
	arr[sm_rear-1] = arr[begin]
	arr[begin] = temp1;
	 
	return sm_rear-1;  //返回中间值的位置
	
}


func Q_sort(arr [] int ,begin int ,rear int) [] int{
	if begin < rear{
		mid_posi := Q_sort_part(arr ,begin ,rear)
	
		Q_sort(arr, begin ,mid_posi-1)
		Q_sort(arr ,mid_posi + 1, rear)
	}
	
	return arr
}

再次运行测试:运行通过:

在这里插入图片描述

2.5 进行基准测试:

在测试代码下面加上如下基准测试函数:基准测试运行时,代码会运行 b.N 次,并测量需要多长时间。用 go test -bench=. 来运行基准测试。

func BenchmarkQ_sort(b * testing.B) {
	for i := 0; i < b.N;  i++ {
		var arr_t= [ ] int { 34, 56,23,71,29,53}
		Q_sort(arr_t , 0 , 5)
	}
}

用 go test -bench=. 来运行基准测试,运行结果:

$ go test -bench=.

在这里插入图片描述

运行了代码5000000次,每次运行的时间为251ns;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值