• 顺序表操作补充(查找方法增加)


    顺序表操作补充

    二分查找

    a.非递归方法实现二分查找

     1 //[]
     2 int BinarySearch(SeqList *pSeq, ElemType x)
     3 {
     4     assert(pSeq);
     5     int left = 0;
     6     int right = pSeq->size - 1;
     7     while(left<=right)
     8     {
     9         int cur = left+(right-left)/2;
    10         if(pSeq->array[cur] == x)
    11         {
    12             return cur;
    13         }
    14         else if(pSeq->array[cur]>x)
    15         {
    16             right = cur - 1;
    17         }
    18         else
    19             left = cur + 1;
    20     }
    21     return -1;
    22 }

    b 递归方法实现二分查找:

     1 //////////////////////////////////递归实现二分查找
     2 int BinarySearch_R(SeqList *pSeq,int left,int right ,ElemType x)
     3 { 
     4     if (left<=right)  
     5     {  
     6         int mid = left+(right-left)/2;  
     7         if( x== pSeq->array[mid])  
     8             return mid;  
     9         else if(x<pSeq->array[mid])  
    10             return BinarySearch_R(pSeq,left,mid-1,x);  
    11         else if(x>pSeq->array[mid])  
    12             return BinarySearch_R(pSeq,mid+1,right,x);  
    13     }  
    14     else  
    15         return -1; 
    16 }

    优化的冒泡排序

    注:与一般的冒泡排序相比,优化方法是设置岗哨,监视每次遍历是否有值交换,没有直接退出,减少不必要的循环次数

    优化后的冒泡查找:

     1 //////////冒泡排序优化
     2 void  BubbSort_op(SeqList *s)
     3 {
     4     int exchange = 0;
     5     for(size_t i = 0; i < s->size-1;++i)
     6     {
     7         for(size_t j = 0; j < s->size-1-i; ++j)
     8         {
     9             if(s->array[j] > s->array[j+1])
    10             {
    11                 ElemType tmp = s->array[j];
    12                 s->array[j] = s->array[j+1];
    13                 s->array[j+1] = tmp;
    14                 exchange = 1;
    15             }
    16         }
    17         if(exchange == 0)
    18             return;
    19     }
    20 }

    选择排序实现:

    a.选择排序(非优化)

    注:内层每次循环找到最大的值,与外层循环控制的位置进行交换

     1 /////////////////////选择排序
     2 void  SelectSort(SeqList *s)
     3 {
     4     for(size_t i = 0; i < s->size-1;++i)
     5     {
     6         int maxind = i;
     7         for(size_t j = i+1; j < s->size; ++j)
     8         {
     9             if(s->array[j] > s->array[maxind])
    10             maxind = j;
    11         }
    12         //change maxind  and  i;
    13         ElemType tmp = s->array[i];
    14         s->array[i] = s->array[maxind];
    15         s->array[maxind] = tmp;
    16     }
    17 }

    b.选择排序优化:

    注:每次内层找到最大,最小两个值,与头尾进行交换,循环次数减少一半

    这种情况应当注意的一点是,如果你两边的标记走到中间时,有可能错误,所以会有进入循环先判断,杜绝该问题的存在(12行)

     if(s->array[min]>s->array[max])
      {
       ElemType tmp1 = s->array[max];
       s->array[max] = s->array[min];
       s->array[min] = tmp1;
      }

     1 /////////////////////选择排序优化
     2 void  SelectSort_op(SeqList *s)
     3 {
     4     int max = s->size-1;
     5     int min = 0;
     6     //从两端往中间走,比较,循环次数缩小一半
     7     while(max >= min)
     8     {
     9         int maxind = max;
    10         int minind = min;
    11         //当遇到刚好[6,5]时,尴尬了。兑换
    12         if(s->array[min]>s->array[max])
    13         {
    14             ElemType tmp1 = s->array[max];
    15             s->array[max] = s->array[min];
    16             s->array[min] = tmp1;
    17         }
    18         ///找到最大最小值
    19         for(int i = min;i<=max;++i)
    20         {
    21             if(s->array[i]>s->array[maxind])
    22             {
    23                 maxind = i;
    24             }
    25             if(s->array[i]<s->array[minind])
    26             {
    27                 minind = i;
    28             }
    29         }
    30         ///兑换并缩小范围
    31         ElemType tmp = s->array[minind];
    32         s->array[minind] = s->array[min];
    33         s->array[min] = tmp;
    34         ElemType tmp1 = s->array[maxind];
    35         s->array[maxind] = s->array[max];
    36         s->array[max] = tmp1;
    37         max--;
    38         min++;
    39     }
    40 }

    希望以上功能实现对各位有所帮助,如有何缺陷或者可改进之处欢迎各位大神指正。

  • 相关阅读:
    发送短信/邮件/打电话 code(转)
    如何学习算法
    堆和栈的区别
    2010 baidu笔试
    关于TableView中图片的延时加载(转)
    sqlite + UITableView 实现iPhone大数据浏览
    2010 Google中国笔试试题
    海量数据处理方法总结(转)
    IPhone WebApp 设计开发工具与资源(转)
    DynamicDataSet
  • 原文地址:https://www.cnblogs.com/lang5230/p/4984676.html
Copyright © 2020-2023  润新知