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

顺序表操作补充

二分查找

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 }

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

时间: 2024-10-07 06:33:11

顺序表操作补充(查找方法增加)的相关文章

6-2 顺序表操作集

6-2 顺序表操作集(20 分) 本题要求实现顺序表的操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; str

6-2 顺序表操作集(20 分)

6-2 顺序表操作集(20 分) 本题要求实现顺序表的操作集. 函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; str

c语言学习之顺序表操作

 //seqlist.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ #define MAXSIZE  100 typedef struct { int listLen;  //节点数量 DATA_T  dataList[MAXSIZE+1]; }seqListType; /* 初始化顺序表 */ void seqlist_init(seqListType *sl); /* 返回顺序表的元素数量 */ int seqlist_length(seqListT

嵌入式菜鸟算法②---顺序表操作

主要内容:顺序表插入.删除 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1024 typedef int datatype; typedef struct { datatype data[MAXSIZE]; int last; // subscript of linear list's last node,i.e. length is n = last + 1 }sequenlist; /* linear list

13.Django之数据库models&amp;orm连表操作补充以及其他知识点补充(二)

一.外键关联. 假如说,现在有两张表,一张user表,这个表中存放了用户账户信息,还有一张usertype表,这张表存放了用户账户的类型. from django.db import models class UserType(models.Model): #用户类型表,虽然没有创建ID字段,但是ID字段会自动创建. type = models.CharField(max_length=32) class User(models.Model): #用户表 username = models.Ch

4-2 顺序表操作集

函数接口定义: List MakeEmpty(); Position Find( List L, ElementType X ); bool Insert( List L, ElementType X, Position P ); bool Delete( List L, Position P ); 其中List结构定义如下: typedef int Position; typedef struct LNode *List; struct LNode { ElementType Data[MAX

[PTA] 数据结构与算法题目集 6-2 顺序表操作集

//创建并返回一个空的线性表: List MakeEmpty() { List L; L = (List)malloc(sizeof(struct LNode)); L->Last = -1; //因为插入一个时,Last++,此时需为-1 return L; } //返回线性表中X的位置.若找不到则返回ERROR: Position Find(List L, ElementType X) { for (int i = 0; i <= L->Last; i++) { if (L->

Django分表操作及FQ方法

聚合 aggregate(*args, **kwargs) # 计算所有图书的平均价格 from django.db.models import Avg Book.objects.all().aggregate(Avg('price')) #{'price__avg': 34.35} aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出来的.如果你想要为聚合

ORM多表操作之一对多增加记录

建立外键:publish=models.ForeignKey("Publish") 默认关联主键,并默认加_id,可以不加影号,但要写下面,不然找不到,加影号是按映射关系寻找 publish_id=2 或 publish=object 原文地址:https://www.cnblogs.com/jintian/p/11167039.html