数据结构与算法之折半查找(C++)

  前面我们讲了顺序查找,但是我们能够真切的感受到查找速度比较慢,然后接下来我们来看一看折半查找,对于折半查找,他要求数据是排好序的,这样折半查找的速率就非常快,而顺序查找的话,数据可以是无序的,所以在进行折半查找之前,需要对数据进行排序,这样就能大大加快我们查找的速度,前面我们讲的排序就可以用上了,对于折半查找,我们来举个例子

比如,我们有100万数,我们就直接找到中间的那个数,跟我们需要查找的数进行比较,如果大了,就在上半部分进行查找,小了,就在下半部分进行查找,这样缩小查找范围,可以大大的提高查找速率,下面我们用程序理解一下。

例1(有序数据查找)

1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int Search(int *a, const int x, const int n);
 6 
 7 int main()
 8 {
 9     int a[] = {2,4,6,8,10,12,13,15,17,19};
10     int result;
11     int b = 19;
12 
13     result = Search(a ,b ,10);
14 
15     if(result == -1)
16         cout << "没找到!" <<endl;
17     else
18         cout << "在a[" << result << "]中找到" << b <<endl;
19 
20     return 0;
21 }
22 
23 int Search(int *a, const int x, const int n)
24 {
25     int low , high , mid;
26     low = 0;
27     high = n-1;
28 
29     while(low <= high)                                                                 
30     {
31         mid = (low + high)/2;
32         if(a[mid] == x)
33             return mid;
34         else if(a[mid] < x)
35             low = mid + 1;
36         else if(a[mid] > x)
37             high = mid - 1;
38     }
39     return -1;
40 }

 

例2(无序数据查找,需要先排序在折半查找)

1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 void SelectSort(int *list , int n);
 6 int search(int *a, const int x, const int n);
 7 
 8 int main()
 9 {
10     int a[] = {2,4,6,8,0,1,3,5,7,9};
11     int result;
12     int b = 4;
13     SelectSort(a,10);
14     for(int k=0; k<10; k++)
15         cout << a[k] <<endl;
16 
17     result = search(a, b, 10);
18     if(result == -1)
19         cout << "没找到" <<endl;
20     else
21         cout << "在[" << result << "]找到" << b <<endl;                                
22 
23     return 0;
24 }
25 
26 void SelectSort(int *list, int n)
27 {
28     for(int i=0; i<n-1; i++)
29     {
30         int min = i;
31         for(int j=i+1; j<n; j++)
32         {
33             if(list[j]<list[min])
34                 min = j;
35         }
36         swap(list[i],list[min]);
37     }
38 
39 }
40 
41 int search(int *a , const int x , const int n)
42 {
43     int low , high, mid;
44     low = 0;
45     high = n-1;
46 
47     while(low <= high)
48     {
49         mid = (low + high)/2;
50         if(a[mid] == x)
51             return mid;
52         else if(a[mid] > x)
53             high = mid -1;
54         else if(a[mid] < x)
55             low = mid +1;
56 
57     }
58     return -1;
59 }

 

posted @ 2021-01-03 10:26  拼命的骡子  阅读(909)  评论(0编辑  收藏  举报