| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2828 人关注过本帖
标题:折半查找(二分查找)
只看楼主 加入收藏
WL2311296974
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:37
专家分:7
注 册:2017-3-30
结帖率:90%
收藏
已结贴  问题点数:10 回复次数:7 
折半查找(二分查找)

主要不会写main函数
望各位大神帮忙解决,谢谢!!!!!!


#include "stdio.h"
#include "malloc.h"
#define TRUE 1
typedef int Keyelem;
typedef struct
{
    Keyelem key;
    int length;
}SortedSeq;

int binarySearch(int *SortedSeq,int KeyData,int Sortedlength)
{
   
    int low=0,mid,high=Sortedlength-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(KeyData==SortedSeq[mid])
        {
            return mid;
        }
    else    if(KeyData<SortedSeq[mid])
        {
        return    high=mid-1;
        }
    else    if(KeyData>SortedSeq[mid])
        {
        return    high=mid+1;
        }
    else{     return mid;}
    return 0;
    }
}
int main()
{
    int KeyData;
    int binarySearch;
    int array[]={11,12,13,14,15,16,17,18,19};
    int target=3;
    int location;



/*   main函数的输出为这些
printf("二分查找的查找位置为: ");  
printf("二分查找的次数为:");
*/


}
搜索更多相关主题的帖子: include return 
2017-05-26 18:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
貌似调用函数出问题了~感觉调用的不是数组而是结构体成员数组~还有~先初始化~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-26 19:16
WL2311296974
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:37
专家分:7
注 册:2017-3-30
收藏
得分:0 
把结构体删掉呢

我的类不是你的泪
2017-05-26 19:49
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 WL2311296974
你可以把结构体改为数组试试~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-27 01:59
林月儿
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:5 
以结构体数组的话是流程是这么分析的
程序代码:
//核心处理函数存在问题,似乎while循环最多执行一次,稍改一下 
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
typedef int Keyelem;
typedef struct {
    Keyelem key;
    int length;//如果是结构体包数组,可以留,但是结构体只是单个元素统计表意不明。 
}SortedSeq;
int times=0;
/**

 * 查找实现方法

 * array 数组对象 

 * start 查找范围开始端索引 

 * end 查找范围结束端索引 

 */
int binarySearchSub(SortedSeq array[], int start, int end, int value) {
    times++; 
    if (start > end) {
        return -1;
    }
    int    mid = (start+end)/2;
    int compare_result = array[mid].key - value;
    
    if (compare_result > 0){
        end = mid + 1;
        return binarySearchSub(array, start, end, value);
    } else if(compare_result < 0){
        start = mid - 1;
        return binarySearchSub(array, start, end, value);
    } else {
        return mid;
    }    
}
/**

 * 二分法排序入口 

 * array 被查找数组

 * len 数组长度

 * value 被查找元素 

 */ 
int binarySearch(SortedSeq array[], int len, int value) {
    return binarySearchSub(array, 0, len - 1, value);
}
/**

 * 自定义比较器

 * 按key值升序 

 */
int compare(SortedSeq ele1, SortedSeq ele2){
    return ele1.key-ele2.key;
}
/**

 *  排序方法

 * array  待排序数组

 * n 数组长度 

 */ 
void sort(SortedSeq array[], int n){
    int i,j;
    for(i = 0; i < n; i++){
        for(j = 0; i + j < n - 1; j++){
            if(compare(array[j], array[j + 1])>0) {
                SortedSeq temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}
/**

 * 遍历数组并输出key属性 

 * array 数组对象 

 */ 
void display(SortedSeq array[], int n){
     for(int i = 0; i < n; i++) {
         printf("%d ",array[i].key);
    }
    printf("\n");
}


int main()
{
    /** preparation work */
    int key_arrs[]={11,12,13,14,15,16,17,18,19};
    int n=sizeof(key_arrs)/sizeof(key_arrs[0]);
    SortedSeq seqs[n];
    for (int i = 0; i < n; i++) {
        seqs[i].key = key_arrs[i];
    }
    display(seqs, n);
    sort(seqs, n);
    display(seqs, n);
    int found_index = binarySearch(seqs, n, 17);
    /**   main函数的输出为这些 */
    printf("二分查找的查找位置为: %d\n", found_index);
    
    printf("二分查找的次数为: %d", times);

}

剑栈风樯各苦辛,别时冰雪到时春
2017-05-28 11:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
之前自己帮一个同学写的作业~和这个差不多~差点忘记发上来了~~~
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MAXSIZE 100
#define LEN 100

typedef struct 
{
    int data[MAXSIZE]; //存在范围0~MAXSIZE-1
    int length;  //长度
}SeqList;

void init(SeqList *L,int n)
{
       srand((unsigned )time(NULL));
       L->length=n;

    for(int i=0;i<L->length;i++)
        L->data[i]=5*i+rand()%5;

}

void print(SeqList *L)
{
       for(int i=0;i<L->length;i++)
        printf("%4d ",L->data[i]);

    printf("\n");
}

/********************1.线性查找法算法思想描述***********************/
//
//
// 

//线性查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素 
int LinearSerach(SeqList *L,int key)
{
    int i=0;
    while (i<L->length&&L->data[i]<key)
        ++i;

    return (i!=L->length&&L->data[i]==key)?i:-1;

}


/********************2.二分查找法算法思想描述***********************/
//
//
//
// 

//二分查找法的迭代版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素 
int BinarySerach(SeqList *L,int key)
{
    int i, low=0, high=L->length-1, mid;
    int find=0;
    while (low<=high && !find)
    {    
        mid=(low+high)/2;

        if (key<L->data[mid])
            high=mid-1;
        else if (key>L->data[mid])
            low=mid+1;
        else
        {    
            i=mid;
            find=1;
        }
    }

    if (find==0)
        return -1;
    else
        return i;

}

//二分查找法的递归版本
//返回值: 返回元素在L中的位置,不存在返回-1
//参数:L为查找表的顺序存储结构,key为待查找元素,
//low为本次查找范围的下限,high为本次查找范围的上限
int BinarySerach(SeqList *L,int key,int low,int high)
{
    int mid=(low+high)/2;

    if (low>high)
        return -1;

    if (key<L->data[mid])
        return BinarySerach(L,key,low,mid-1);
    else if (key>L->data[mid])
        return BinarySerach(L,key,mid+1,high);

    return mid;
}

int main()
{
    SeqList L;
    
    int i=0;
    int key=0;

    init(&L,LEN);
    print(&L); 


    for (i=0;i<100;++i)
        if ((key=BinarySerach(&L,i))!=-1)
            printf("%-4d",L.data[key]);

        puts("");

    for (i=0;i<100;++i)
        if ((key=LinearSerach(&L,i))!=-1)
            printf("%-4d",L.data[key]);

    puts("");

    for (i=0;i<100;++i)
        if ((key=BinarySerach(&L,i,0,L.length))!=-1)
            printf("%-4d",L.data[key]);

    puts("");

    return 0;
}


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-29 22:34
WL2311296974
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:37
专家分:7
注 册:2017-3-30
收藏
得分:0 
回复 5楼 林月儿
谢谢!!!

我的类不是你的泪
2017-06-01 09:10
WL2311296974
Rank: 1
来 自:安徽
等 级:新手上路
帖 子:37
专家分:7
注 册:2017-3-30
收藏
得分:0 
回复 6楼 九转星河
谢谢!!!

我的类不是你的泪
2017-06-01 09:11
快速回复:折半查找(二分查找)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018589 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved