码迷,mamicode.com
首页 > 其他好文 > 详细

顺序查找和二分法查找

时间:2016-04-22 18:33:23      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

1.顺序查找

      顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查询不成功

流程:输入要查找的数,查找,判断输出

举例

 1  static void Main(string[] args)
 2         { 
 3              //查找
 4             int[] a = new int[8] {2,9,8,13,23,19,33,40};
 5             //输入要找的数
 6             int n =Convert.ToInt32(Console.ReadLine());
 7             //查找
 8             bool found = false;
 9             for (int i = 0; i < 8; i++)
10             {
11                 if (n==a[i])
12                 {
13                     //输出
14                     found = true;
15                     Console.WriteLine("找到啦,是第{0}个数。",i+1);
16                 }
17             }
18 
19             if (found==false)
20             {
21                 Console.WriteLine("没找到");
22             }
23 
24         }

 2.彩票生成器

 1  static void Main(string[] args)
 2         {
 3             //彩票生成器
 4             int[] a = new int[7];
 5             Random rand = new Random();
 6 
 7             //生成7个不重复的数
 8             for (int i = 0; i < 7; i++)
 9             {
10                 int n = rand.Next(36);
11                 n++;
12                 bool cunzai = false;
13                 for (int j = 0; j < a.Length; j++)
14                 {
15                     if (a[j]==n)
16                     {
17                         cunzai = true;
18                         break;
19                     }
20                 }
21 
22                 //判断存在不存在,如果不存在,放进a数组中,如果存在,重新生成。
23                 if (cunzai==false)
24                 {
25                     a[i] = n;
26                 }
27                 else
28                 {
29                     i--;
30                 }
31             }
32             for (int i = 0; i <a.Length; i++)
33             {
34                 Console.Write(a[i]+"  ");
35             }
36         }

 

2.二分法查找

 

      折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素,如果要查找的元素正好和该中间位置元素相等,通过一次查找,就能找到匹配元素;如果要查找的元素小于该中间位置元素,就抛弃后面一半的元素,在前面一半的元素中再定位出中间位置元素,如此反复,直到找到匹配元素;如果要查找的元素大于该中间位置元素,就抛弃前面一半的元素,在后面一半的元素中定位出中间位置元素,如此反复。

 

      面临的第一个问题是:中间位置元素如何定位?在折半查找中规定:当元素个数是奇数,比如有3个元素,中间位置元素是索引为1的元素;当元素个数是偶数,比如有4个元素,索引为1和2的元素理论都是中间位置元素,但在折半查找中,把后面这个,即索引为2的元素视为中间位置元素。

 

      面临的第二个问题是:由于,要查找的元素和中间位置元素之间需要比较,我们在比较之前,势必要让数组按升序或降序来排列。

 

      自定义一个类,该类维护着一个int[]类型数组,通过构造函数确定数组长度和对数组进行排序,并提供打印数组元素的方法,以及折半算法。

 

举例:

 1  static void Main(string[] args)
 2         { 
 3             //二分法查找(前提条件数组按大小排列)
 4             int[] a = new int[8] {1,2,3,4,5,6,12,33 };
 5             
 6             //输入要找的数
 7             int find = Convert.ToInt32(Console.ReadLine());
 8 
 9             //定义开始坐标,中间坐标,结束坐标,中间坐标=(开始坐标+结束坐标)/2
10             int start = 0, end = a.Length - 1, mid;
11 
12             //比较
13             while(true)
14             {
15                 mid = (start + end) / 2;
16                 if (a[mid]==find)
17                 {
18                     Console.WriteLine("找到啦,是第{0}个数",mid+1);
19                     break;
20                 }
21                 else
22                 {
23                     if (find>a[mid])
24                     {
25                         start = mid + 1;
26                     }
27                     else
28                     {
29                         end = mid - 1;
30                     }
31                     if (end<start)
32                     {
33                         Console.WriteLine("没找到");
34                         break;
35                     }
36                 }
37             }
38         }

 

顺序查找和二分法查找

标签:

原文地址:http://www.cnblogs.com/kellybutterfly/p/5422302.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!