二分查找法:
首先有三个变量,数组的头部索引(l),数组的尾部索引(r),数组的中间比较值(mid),也是索引。 现在要查找的值(targat),然后比较 mid ,小,就在 l 、mid减1的区间在进行比较,然后一直推到找到为止,或者 r 右边的索引比 l 左边的索引小,那查找的条件就不成立了。大的话,同样的道理。 详情如下图:
顺序查找法与二分查找法之间的性能对比
二分查找虽然比顺序查找的效率高数倍,但它,仅仅只是对于有序数组的高效查找法。 这也是为什么执行 Array.Sort(); //将传进来的数组元素进行排序
class TestSearch
{
//读取名为filename的文件并将数据存储到数组中返回
public static int[] ReadFile(string filename)
{
//通过某种方式打开 filename 文件
FileStream fs = new FileStream(filename, FileMode.Open);
//打开文件后,通过某种方式,进行读写
StreamReader sr = new StreamReader(fs);
//实例话一个整数类型的泛型对象
List<int> list = new List<int>();
//判断是否读写结束
while (!sr.EndOfStream)
{
//由于读写的数据类型是 string ,所以需要转换为 int 类型
int num = int.Parse(sr.ReadLine());
//然后,添加在整数类型的泛型数组
list.Add(num);
}
//关闭 filename 文件
fs.Close();
//不在读写文件
sr.Close();
//toArray():将 list 数组 复制到新的数组
//返回值的就是,list 的数组元素
return list.ToArray();
}
//顺序查找法
public static int OrderSearch(int[] arr, int target)
{
for (int i = 0; i < arr.Length; i++)
if (arr[i] == target)
return i;
return -1;
}
/// <summary>
/// 二分查找,在有序数组arr中,查找target
///如果找到target,返回相应的索引index
///如果没有找到target,返回-1
/// </summary>
/// <param name="arr">数组</param>
/// <param name="target">想查找的值</param>
public static int BinarySearch(int[] arr, int target)
{
int l = 0; //代表数组头部的索引
int r = arr.Length - 1; //代表数组尾部的索引
while (l <= r)
{
//中间值
//用于比较 target《查找的值》是中间值的左边还是右边
int mid = l + (r - l) / 2;
if (target < arr[mid])
r = mid - 1;
else if (target > arr[mid])
l = mid + 1;
else
return mid;
}
return -1;
}
}
//===================================================================//
class Program
{
private static void Main(string[] args)
{
string filename3 = "测试文件2/游戏会员表.txt";
string filename4 = "测试文件2/游戏用户表.txt";
int[] arr3 = TestSearch.ReadFile(filename3);
int[] arr4 = TestSearch.ReadFile(filename4);
Console.WriteLine("游戏会员数量 :" + arr3.Length);
Console.WriteLine("调查用户数量 :" + arr4.Length);
Console.WriteLine();
Stopwatch t3 = new Stopwatch();
Stopwatch t4 = new Stopwatch();
Console.WriteLine("顺序查找法");
t3.Start();
int sum3 = 0;
for (int i = 0; i < arr4.Length; i++)
{
int target = arr4[i];
if (TestSearch.OrderSearch(arr3, target) == -1)
{
//Console.WriteLine(target);
sum3++;
}
}
t3.Stop();
Console.WriteLine("查找到 :" + sum3 + "个零充玩家");
Console.WriteLine("运行时间: " + t3.ElapsedMilliseconds + "ms");
Console.WriteLine();
Console.WriteLine("二分查找法");
t4.Start();
Array.Sort(arr3);
int sum4 = 0;
for (int i = 0; i < arr4.Length; i++)
{
int target = arr4[i];
if (TestSearch.BinarySearch(arr3, target) == -1)
{
//Console.WriteLine(target);
sum4++;
}
}
t4.Stop();
Console.WriteLine("查找到 :" + sum4 + "个零充玩家");
Console.WriteLine("运行时间: " + t4.ElapsedMilliseconds + "ms");
Console.ReadKey();
}
}