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;
}
}