数据结构与算法之折半查找(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 }