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.实验结果为: