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

顺序表操作补充

二分查找

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 }

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

原文地址:https://www.cnblogs.com/lang5230/p/4984676.html