1,顺序查找法
虽然很简单,但很强大,当然只在小数量下。
2,改良型顺序查找法
现在很多的拼音输入法都有一个特性,像Google拼音,经常用到的字或词通常都在最前面,这就是大名鼎鼎的28规则的实际应用。把最常用的20%的字词放到最前面,是很睿智的做法,大多数情况下找到一个字不会要用户翻几下。如果有一个无序且不小的数组或列表的需要进行多次查找,那我们也可以把28规则用到项目中了,这样最经常被查找的数据都会集中前部,加快查找的速度。代码:
public class Example
{
int[] arr;
int upper;public int this[int index]
{
get
{
return arr[index];
}
}public Example(int size)
{
upper = size -1;
arr = new int[size];
Random rand = new Random();
for (int i = 0; i < size; i++)
{
arr[i] = rand.Next(upper);
}
}public int Search(int val)
{
for (int i = 0; i <= upper; i++)
{
if (val == arr[i])
{
if (i > (upper * 0.2))
{
Swap(i, 0);
}
return i;
}
}
return -1;
}private void Swap(int idx1, int idx2)
{
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}}
3,二分查找法
使用二分查找法的前提条件是数据是有序的。如果无序,有时搜得到,有时搜不到。二分查找法有个特性,数据量越是大,查得就越快,时间复杂度为1/2(n2-n)。其思想就是重复缩小查找范围,较上次缩小一倍,直到查到要查询的值或退出查找。
public class Example
{
int[] arr;
int upper;
public int this[int index]
{
get
{
return arr[index];
}
}
public Example(int size)
{
upper = size -1;
arr = new int[size];
Random rand = new Random();
for (int i = 0; i < size; i++)
{
//arr[i] = rand.Next(upper);
arr[i] = i;}
}
public int Search(int val)
{
for (int i = 0; i <= upper; i++)
{
if (val == arr[i])
{
if (i > (upper * 0.2))
{
Swap(i, 0);
}
return i;
}
}
return -1;
}
private void Swap(int idx1, int idx2)
{
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
public int BinarySearch(int val)
{
int mid, min = 0;
int max = upper;
while (min <= max)
{
mid = (max + min) / 2;
if (arr[mid] == val)
{
return mid;
}
else if (arr[mid] < val)
{
min = mid + 1;
}
else
{
max = mid - 1;
}
}
return -1;
}
}