问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一道C语言的题目 二分查找算法和插入元素

发布网友 发布时间:2022-04-18 19:58

我来回答

2个回答

懂视网 时间:2022-04-19 00:19

1 实例

这个模块只有几个函数,

一旦决定使用二分搜索时,立马要想到使用这个模块 

import bisect 
 
L = [1,3,3,6,8,12,15] 
x = 3 
 
x_insert_point = bisect.bisect_left(L,x)  #在L中查找x,x存在时返回x左侧的位置,x不存在返回应该插入的位置..这是3存在于列表中,返回左侧位置1 
print x_insert_point 
 
x_insert_point = bisect.bisect_right(L,x) #在L中查找x,x存在时返回x右侧的位置,x不存在返回应该插入的位置..这是3存在于列表中,返回右侧位置3 
 
print x_insert_point 
 
x_insort_left = bisect.insort_left(L,x) #将x插入到列表L中,x存在时插入在左侧 
print L 
 
x_insort_rigth = bisect.insort_right(L,x) #将x插入到列表L中,x存在时插入在右侧     
 
print L

结果:


1
3
[1, 3, 3, 3, 6, 8, 12, 15]
[1, 3, 3, 3, 3, 6, 8, 12, 15]

实际使用中

2 bisect模块
Bisect模块提供的函数有:
(1)查找
bisect.bisect_left(a,x, lo=0, hi=len(a)) :
查找在有序列表a中插入x的index。lo和hi用于指定列表的区间,默认是使用整个列表。
bisect.bisect_right(a,x, lo=0, hi=len(a))
bisect.bisect(a, x,lo=0, hi=len(a))
这2个和bisect_left类似,但如果x已经存在,在其右边插入。
(2)插入
bisect.insort_left(a,x, lo=0, hi=len(a))
在有序列表a中插入x。如果x已经存在,在其左边插入。返回值为index。 和a.insert(bisect.bisect_left(a,x, lo, hi), x) 的效果相同。
bisect.insort_right(a,x, lo=0, hi=len(a))
bisect.insort(a, x,lo=0, hi=len(a))
和insort_left类似,但如果x已经存在,在其右边插入。
 
可以函数可以分2类,bisect*,用于查找index。Insort*用于实际插入。默认重复时从右边插入。实际常用的估计是insort。

热心网友 时间:2022-04-18 21:27


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义数组初始长度
#define LEN 10
// 生成随机数组
void get_array(int * a, int n)
{
    srand(time(NULL));
    for (int i = 0; i < n; i++)
        a[i] = rand() % 90 + 10;
}

// 打印数组
void print_array(int * a, int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

// 冒泡排序
void bubble_sort(int * a, int n)
{
    int i, j, temp;
    for (j = 0; j < n - 1; j++)
    {
        for (i = 0; i < n - 1 - j; i++)
        {
            if(a[i] < a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
}

// 二分查找,a是数组,n是数组长度,element是要查找的元素
// 找到返回元素所在的下标,否则返回-1
int binary_search(int * a, int n, int element)
{
    int low = 0, high = n - 1, middle = 0;
    middle = (low + high) / 2;
    int pos = -1;
    while (low <= high)
    {
        if (element == a[middle])
            return pos = middle;
        else if (element > a[middle])
        {
            high = middle - 1;
            middle = (low + high) / 2;
        }
        else
        {
            low = middle + 1;
            middle = (low + high) / 2;
        }
    }
    return pos;
}

// 向长度为n的数组a中插入元素element
void insert(int * a , int n, int element)
{
    a = (int *)realloc(a, n + 1);

    for (int i = 0; i <= n; i++)
    {
        if (a[i] > element)
            continue;
        for (int j = n; j > i; j--)
        {
            a[j] = a[j-1];
        }
        a[i] = element;
        break;
    }
}

// 测试
int main()
{
    int *array = (int *)malloc(LEN);
    if (NULL == array)
    {
        printf("内存分配失败\n");
        return -1;
    }
    int element = 0;
    get_array(array, LEN);
    printf("生成的随机数组:\n");
    print_array(array, LEN);
    bubble_sort(array, LEN);
    printf("排序后的数组:\n");
    print_array(array, LEN);

    printf("请输入查找的元素: ");
    scanf("%d", &element);
    int pos = binary_search(array, LEN, element);
    if (-1 == pos)
    {
        printf("未找到元素[%d]\n", element);
        insert(array, LEN, element);
        printf("插入新元素[%d]后的数组:\n", element);
        print_array(array, LEN + 1);
    }
    else
        printf("元素[%d]所在的位置为[%d]\n", element, pos);

    free(array);
    return 0;
}

追问不能运行啊

追答我的环境是RHEL6.5 32位系统,gcc4.9,编译选项-std=c99,假设文件名为main.c,编译目标文件为app,编译指令如下:
gcc -o app -std=c99 main.c
如果你是在windows的VC6下运行的话,需要把函数中所有的变量定义放在函数的开始部分,因为VC6仅支持C89标准,所以编译会报错

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我在电脑上面下的电影在手机上面不显示? 为什么视频在手机里放不出来在电脑里放得出来? 求问bb霜什么牌‍子‍好 BB霜哪个牌子的比较好啊? 我用很多BB霜都过敏脱皮,该用哪个牌子的才能不过敏?拜托了各位 谢谢... 没有去继续教育会计证会不会被吊销? 会计证连续几年未继续教育会被吊销 我想请问,能不能从视频里抓出一段声音,然后保存,变成手机铃声的那种格式... 高中地理知识如何描述地貌特征 中国地理第一讲:自然地理之河流 - 信息提示 中国移动的和多号能注册吗 中国移动的和多号能注册吗 美联储降息为何导致美元贬值?详细点说明基本理由 美联储降息的目的是什么?对那些行业影响较大? 为何美联储降息? 美联储时隔11年首次降息,促使这次降息的因素有什么? 谁能帮忙办理纯白户信用卡,没车没房 问下大家本人19岁,学历低,纯白户,办理哪行的信用卡容易审批,有工作,工资打卡 中国政法大学MPA和国家行政学院MPA哪个好考? 选择了异地恋,总是想要时时刻刻的知道对方在干嘛,时刻想找地方聊天,这样的思想对吗?是不是因为自己不 为什么学习时老想着别人在干什么,别人是不是在看我 跟男朋友在一起总是想知道他在干嘛? 喜欢一个人就是时刻想知道他在做什么。在哪里? 男女之间男生为什么总想知道女生在干嘛? 有个总是偷偷观察你,随时都想了解你在干嘛的室友是什么样的体验? 特别喜欢关心别人的生活 甚至别人在干嘛都想知道是不是很闲 情商低啊? 真心爱一个人是不是每时每刻都想知道对方在做什么那? 为什么总喜欢抓住一个人,紧紧挨着,就是想知道他在干嘛,害怕他和别的女孩子有啥,为什么会这么想? 德行立身之本,才识处世所先是什么意思(转载) 在电脑上能下载2016cad吗 F号的帽子是多大? autocad 2016命令栏提示C:&#92;Program Files&#92;Autodesk&#92;AutoCAD 2016&#92;acsceneui.arx 运行2016版cad用哪款电脑好?各位大神 用长帝电烤箱烤板栗需要多长时间 百度云和百度云盘播放器是一样的吗?他俩是同一种播放器吗? 你们开人人影视的网站卡吗? 泽哥出品,必属精品。这句话什么意思,是怎由来的?? 求一部手机要求:双核或四核,WIFI上网速度快,电池比较耐用的,同时运行微信、QQ+人人不卡,照相要好 为什么在人人网看视频卡,在其他网站看视频不卡,怎样解决 人人网三国杀online 为什么登陆不了服务器??? 推荐一款有360浏览器一样的了邮件、人人、微博 提醒的浏览器,而且不卡不占用太多内存,谢谢 人人快递的精品购好用吗(补充:上面有哪些东西可以买) lol技术太垃圾 总坑 22级 从什么英雄开始练起? 人机还是人人 ?怎么练习 为什么我一登陆人人网就特别卡?? 我想找一些不卡能长期开的动画在线网站有没人人能回答 360浏览器上人人网卡怎么回事?其他网页都不卡 为什么64位win7浏览人人网页面的时候很卡 笔记本看电影、上QQ、人人、玩游戏都不卡,而且下载东西网速很快。但是就是打不开网页,要刷新好多遍。 一生守候 王若琳 链接地址 可以放到人人上的