• 数据结构与算法之折半查找(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 }
  • 相关阅读:
    YUI: Effects Widgets
    提高Web页面的性能(一)
    textindent 隐藏文字时出现的 outline 问题
    通过 Dom 方法提高 innerHTML 性能
    IE8 beta1 中的 CSS 属性
    推荐的 CSS 书写顺序
    来自经典论坛的javascript小小考题
    IE5 到 IE8 的 CSS 兼容列表
    backgroundclip 与 backgroundorigin 的一则运用
    收集整理的对#!bin/sh的认识
  • 原文地址:https://www.cnblogs.com/tanshengjiang/p/14224922.html
Copyright © 2020-2023  润新知