之前有篇二分查找的文章,未在函数里检验参数,现以该篇文章更新,具体看代码,欢迎指正。


二分查找实例c语言版本:

#include <stdio.h>
#include <stdlib.h>

//二分查找, 以int型由小到大有序数组为例实现二分查找
int *binarySearch(int *array, int length, int aim) {
	int left, right, middle;
	int i = 0;

	//验证数组是否由小到大
	for (i = 0; i < (length - 1); i++) {
		if (array[i] > array[i + 1]) {
			printf("所传递参数数组非由小到大有序");
			exit(-1);
		}
	}

	middle = (length + 1) / 2;
	left = 0;
	right = length - 1;

	while(left <= right) {
		if (aim > array[middle]) {
			left = middle + 1;
		} else if (aim < array[middle]) {
			right = middle - 1;
		} else {
			printf("已找到目标数字%d, 要查找的数字在数组的地址是%p\n", aim, &array[middle]);
			return &array[middle];
		}

		middle = (left + right) / 2;
	}

	printf("未找到目标数字%d\n", aim);

	return NULL;
}

//测试binarySearch函数
void binarySearchTest() {
	int arr[7] = {1,2,3,4,5,6,7};//原数组
	int aimArr[3] = {2, 1, 7};//待查找目标数组
	int aim, i, *ptr = NULL;

	printf("开始测试int型有序数组二分查找, 原数组为:\n");
	for (i = 0; i < (sizeof(arr) / sizeof(int)); i ++) {
		printf("arr[%d] = %d, 地址为: %p\n", i, arr[i], &arr[i]);
	}

	for (i = 0; i < (sizeof(aimArr) / sizeof(int)); i ++) {
		aim = aimArr[i];
		printf("\n\n开始测试查找数字:%d\n", aim);
		ptr = binarySearch(arr, (sizeof(arr) / sizeof(int)), aim);
		if(NULL == ptr) {
			printf("未找到数字%d\n", aim);
		} else {
			printf("找到了数字%d, 地址为%p\n", aim, ptr);
		}
	}
	printf("\n全部测试完成\n");
}

int main() {
	binarySearchTest();

	return 0;
}

golang版本:

binarySearch.go文件如下:

package binarySearch

import (
	"log"
)

func BinarySearch(array []int, aim int) (*int, bool) {
	//验证数组是否是由小到大的顺序
	for i := 0; i < len(array)-1; i++ {
		if array[i] > array[i+1] {
			log.Println("数组非由小到大有序数组")
			return nil, false
		}
	}
	log.Println("已验证数组由小到大有序")

	//开始二分查找
	var left, right int = 0, (len(array) - 1)
	var middle int = (left + right) / 2
	for left <= right {
		if aim > array[middle] {
			left = middle + 1
		}
		if aim < array[middle] {
			right = middle - 1
		}
		if aim == array[middle] {
			log.Printf("已找到目标数 %d \n", aim)
			return &array[middle], true
		}
		middle = (left + right) / 2
	}

	//运行到此处时left > right, 表示未找到目标数
	log.Printf("没有找到目标数 %d\n", aim)

	return nil, false
}

测试文件binarySearch_test.go文件如下:

package binarySearch

import (
	"log"
	"testing"
)

func TestBinarySearch(t *testing.T) {
	array := []int{1, 2, 3, 4, 5, 6, 7} //切片
	aimArray := [...]int{3, 1, 7, 8}    //待查找数据,数组
	expextedReturn := [...]struct {
		ptr *int
		ok  bool
	}{
		{&array[2], true},
		{&array[0], true},
		{&array[6], true},
		{nil, false},
	}

	for i := 0; i < len(aimArray); i++ {
		log.Printf("开始测试查找数字 %d\n", aimArray[i])

		if ptr, ok := BinarySearch(array, aimArray[i]); expextedReturn[i].ok == ok && expextedReturn[i].ptr == ptr {
			log.Printf("测试目标数字 %d 无问题\n\n\n", aimArray[i])
		} else {
			log.Printf("测试目标数字 %d 出错了 !!!\n\n\n", aimArray[i])
		}
	}
}

运行go test -v命令,开始单元测试,结果如下