數據結構與算法之折半查找(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 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章