顺序表的折半查找


1.因为折半查找必须要比大小,所以要先将顺序表排个序,这里使用了冒泡排序的方法

//冒泡排序
Status SelectList_Sq(SqList &L){
//因为要进行折半查找,所以必须要先给顺序表排个序。
//这里用的是冒泡排序的方法,就是相邻的两个元素两两比较,大的数放在后面。 
    for(int i=1;i<=L.length;i++){
        for(int j=1;j<=L.length-i;j++){
            if(L.elem[j-1]>=L.elem[j]){
                int k=L.elem[j-1];
                L.elem[j-1]=L.elem[j];
                L.elem[j]=k;
            }
        }
    }
    return OK;
} 

2.然后就是折半查找

//折半查找
Status FoundList_Sq(SqList L,ElemType e){
//折半查找的思路就是要判断待找的数与顺序表中间的数的大小,如果大于中间的数,就说明他在右半边,如果小于中间的数,就说明他在左半边。 
    int top,bottom,mid;//定义了顺序表的两端和中间的位置 
    top=L.length-1;
    bottom=0;
    while(top>=bottom){
        mid=(top+bottom)/2; //每一次循环的mid都要改变 
        if(e>L.elem[mid]){
            top=mid-1;//如果他比中间位置的数要大,就在右半边 
        }
        else if(e<L.elem[mid]){
            bottom=mid+1;//如果他比中间位置的数要小,就在左半边 
        }
        else if(e==L.elem[mid]){
            return mid+1; //如果相等的话,就直接返回mid+1就可以了 
        }
    }
}

3.总的代码为:

#include<stdio.h>
#include<malloc.h>
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100 
typedef int ElemType;
typedef int Status;
typedef struct{
    ElemType *elem;
    int length;
    int listsize;
}SqList;
//建立顺序表
Status InitList_Sq(SqList &L,int n){
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!L.elem)exit(OVERFLOW); 
    printf("请输入顺序表中的元素:");
    for(int i=0;i<n;i++){
        scanf("%d",&L.elem[i]);
    } 
    L.length=n;
    L.listsize=LIST_INIT_SIZE;
    return OK;
} 
//输出顺序表
Status ExitList_Sq(SqList L){
    for(int i=0;i<L.length;i++){
        printf("%d ",L.elem[i]);
    }
    printf("\n");
} 
//冒泡排序
Status SelectList_Sq(SqList &L){
//因为要进行折半查找,所以必须要先给顺序表排个序。
//这里用的是冒泡排序的方法,就是相邻的两个元素两两比较,大的数放在后面。 
    for(int i=1;i<=L.length;i++){
        for(int j=1;j<=L.length-i;j++){
            if(L.elem[j-1]>=L.elem[j]){
                int k=L.elem[j-1];
                L.elem[j-1]=L.elem[j];
                L.elem[j]=k;
            }
        }
    }
    return OK;
} 
//折半查找
Status FoundList_Sq(SqList L,ElemType e){
//折半查找的思路就是要判断待找的数与顺序表中间的数的大小,如果大于中间的数,就说明他在右半边,如果小于中间的数,就说明他在左半边。 
    int top,bottom,mid;//定义了顺序表的两端和中间的位置 
    top=L.length-1;
    bottom=0;
    while(top>=bottom){
        mid=(top+bottom)/2; //每一次循环的mid都要改变 
        if(e>L.elem[mid]){
            top=mid-1;//如果他比中间位置的数要大,就在右半边 
        }
        else if(e<L.elem[mid]){
            bottom=mid+1;//如果他比中间位置的数要小,就在左半边 
        }
        else if(e==L.elem[mid]){
            return mid+1; //如果相等的话,就直接返回mid+1就可以了 
        }
    }
}
int main(){
    SqList L;
    int n;
    printf("请输入顺序表中元素的个数:");
    scanf("%d",&n);
    InitList_Sq(L,n);
    ExitList_Sq(L);
    SelectList_Sq(L);
    ExitList_Sq(L);
    ElemType e;
    printf("请输入想要查找的元素:");
    scanf("%d",&e);
    printf("元素%d的位置为:%d",e,FoundList_Sq(L,e)); 
} 

 

4.实验结果为:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM