第1章第1节练习题9 查找指定值

news/2024/5/20 7:22:42 标签: 数据结构, 算法, 顺序表

问题描述

线性表 (a1,a2,a3,...,an) 中元素递增有序,且按顺序存储于计算机内。要求设计一算法完成用最少时间在表中查找数据值为x的元素;若找到,将其与后继元素位置交换;若找不到将其插入到表中,使表中的元素仍递增有序

算法思想">算法思想

本题递增有序,为了在最少的事件内完成指定数据x的查找,那么我们可以采用折半查找的思想查找x,如果找到,那么与后继元素交换一次,如果找不到则顺序插入便可。

算法描述">算法描述

int FindDI(SqList *L, ElemType x)
{
    int low=0, high=L->length-1;
    int mid;
    //折半查找
    while(low<high){
        mid=(low+high)/2;
        if(L->data[mid]==x){
            break;
        }else if(L->data[mid]<x){
            low=mid+1;
        }else{
            high=mid-1;
        }
    }
    //已找到,与后继元素位置交换
    if(L->data[mid]==x&&L->data[mid]!=L->length-1){
        ElemType temp;
        temp=L->data[mid];
        L->data[mid]=L->data[mid+1];
        L->data[mid+1]=temp;
        return mid+1;
    }
    //未找到,插入该元素,并且使表中的元素仍递增有序
    if(low>high){
        int i;
        for(i=L->length;i>mid;i--){
            L->data[i]=L->data[i-1];
        }
        L->data[i]=x;
        L->length=L->length+1;
        return -1;
    }
    return 0;
}

具体代码见附件


附件

#include<stdio.h>
#define MaxSize 100
typedef int ElemType;

typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

int FindDI(SqList*, ElemType);
void Print(SqList*);

int main(int argc,char *argv[])
{
    SqList SL;
    ElemType e=4;
    SL.length=10;
    for(int i=0;i<SL.length;i++){
        SL.data[i]=2*i+1;
    }
    Print(&SL);
    int flag=FindDI(&SL,e);

    if(flag==-1){
        printf("Find fail!,It will be instered the true position\n");
        Print(&SL);
    }else{
        printf("Find success!\n");
        printf("It is posed %dth, It will swap with next number!\n", flag);
        Print(&SL);
    } 
    return 0;
}

int FindDI(SqList *L, ElemType x)
{
    int low=0, high=L->length-1;
    int mid;
    while(low<high){
        mid=(low+high)/2;
        if(L->data[mid]==x){
            break;
        }else if(L->data[mid]<x){
            low=mid+1;
        }else{
            high=mid-1;
        }
    }

    if(L->data[mid]==x&&L->data[mid]!=L->length-1){
        ElemType temp;
        temp=L->data[mid];
        L->data[mid]=L->data[mid+1];
        L->data[mid+1]=temp;
        return mid+1;
    }

    if(low>high){
        int i;
        for(i=L->length;i>mid;i--){
            L->data[i]=L->data[i-1];
        }
        L->data[i]=x;
        L->length=L->length+1;
        return -1;
    }
    return 0;
}

void Print(SqList *L)
{
    for(int i=0;i<L->length;i++){
        printf("%4d",L->data[i]);
    }
    printf("\n");
}

http://www.niftyadmin.cn/n/1801503.html

相关文章

SQL Server 中的模糊查询 LIKE

搜索条件中的模式匹配 LIKE 关键字搜索与指定模式匹配的字符串、日期或时间值。LIKE 关键字使用常规表达式包含值所要匹配的模式。模式包含要搜索的字符串&#xff0c;字符串中可包含四种通配符的任意组合。 通配符含义%包含零个或更多字符的任意字符串。_任何单个字符。[ ]指定…

第1章第1节练习题10 查找中位数

问题描述 一个长度为L(L ≥1) 的升序序列S&#xff0c;处在第 ⌜ L/2 ⌝ 个位置的数称为S的中位数。例如&#xff0c;若序列S1(11,13,15,17,19)&#xff0c;则S1的中位数是15&#xff1b; 两个序列的中位数是含它们所有元素所组成的升序序列的中位数。例如&#xff0c;若S2(2,…

Remoting技术

稍后我会将Remoting技术奉献给大家&#xff0c;让我们一起在.net技术中畅游

第1章第2节 线性表的链式表示(1)

由于顺序表的插入&#xff0c;删除操作需要移动大量的元素&#xff0c;影响了运算效率&#xff0c;由此线性表的链式存储便应运而生。链式存储线性表时&#xff0c;逻辑上连续的元素物理结构上不需要连续&#xff0c;它们彼此可以通过“链”建立起数据元素之间的逻辑关系&#…

[转]一个简单的中文分词

CLucene - a C search engine http://sourceforge.net/projects/clucene/传统的全文检索都是基于数据库的&#xff0c;Sql Server Oracle mysql 都提供全文检索&#xff0c;但这些比较大&#xff0c;不适合单机或小应用程序(Mysql4.0以上可以作为整合开发)&#xff0c;Mysql也…

第1章第2节 线性表的链式表示(2)

单链表中只有一个指向其后继结点的指针&#xff0c;使得单链表只能从前向后依次遍历&#xff0c;若要访问某个结点的前驱结点&#xff08;或插入&#xff0c;删除操作时&#xff09;&#xff0c;只能从头开始遍历&#xff0c;访问后继结点的时间复杂度为O(1)&#xff0c;而访问…

第1章第2节 线性表的链式表示(3)

一.循环链表 当使用单链表进行遍历的时候&#xff0c;我们只能从头结点开始&#xff0c;尾结点结束&#xff0c;如果需要查看指针所指向结点的前面结点&#xff0c;我们又必须从头结点开始遍历。为了解决这个问题&#xff0c;我们便引入了双链表&#xff0c;使其能够双向遍历&…

无提示关闭网页浏览器

Javascript技术 //无提示关闭网页浏览器function Close() { var uanavigator.userAgent var ienavigator.appName"Microsoft Internet Explorer"?true:false if(ie) { var IEversionparseFloat(ua.substring(ua.indexOf("MSIE ")5,ua.indexOf(";…