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.實驗結果為: