注册 登录
编程论坛 数据结构与算法

折半查找(二分查找)

WL2311296974 发布于 2017-05-26 18:37, 2995 次点击

主要不会写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("二分查找的次数为:");
*/


}
7 回复
#2
九转星河2017-05-26 19:16
貌似调用函数出问题了~感觉调用的不是数组而是结构体成员数组~还有~先初始化~
#3
WL23112969742017-05-26 19:49
把结构体删掉呢
#4
九转星河2017-05-27 01:59
回复 3楼 WL2311296974
你可以把结构体改为数组试试~
#5
林月儿2017-05-28 11:23
以结构体数组的话是流程是这么分析的
程序代码:
//核心处理函数存在问题,似乎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);

}
#6
九转星河2017-05-29 22:34
之前自己帮一个同学写的作业~和这个差不多~差点忘记发上来了~~~
程序代码:

#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;
}

#7
WL23112969742017-06-01 09:10
回复 5楼 林月儿
谢谢!!!
#8
WL23112969742017-06-01 09:11
回复 6楼 九转星河
谢谢!!!
1