前面我們講了順序查找,但是我們能夠真切的感受到查找速度比較慢,然後接下來我們來看一看折半查找,對於折半查找,他要求數據是排好序的,這樣折半查找的速率就非常快,而順序查找的話,數據可以是無序的,所以在進行折半查找之前,需要對數據進行排序,這樣就能大大加快我們查找的速度,前面我們講的排序就可以用上了,對於折半查找,我們來舉個例子
比如,我們有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 }