1、顺序查找
#include <stdio.h>
#define MAXSIZE 20
typedef struct{
int key;
int otherData;
}SeqList;
int search(SeqList sl[],int n,int x){
for(int i=0;i<n;i++){
if(sl[i].key == x){
return i;
}
}
return -1;
}
int main(){
int n,x,temp;
SeqList sl[MAXSIZE];
printf("请输入元素的个数!\n");
scanf("%d",&n);
for(int t=0;t<n;t++){
sl[t].otherData = 0;
}
printf("请输入所有的元素!\n");
for(int i=0;i<n;i++){
scanf("%d",&sl[i].key);
}
printf("列表中的元素是:\n");
for(int j=0;j<n;j++){
printf("%d ",sl[j].key);
}
printf("\n");
printf("请输入要查找的元素!(-1结束)\n");
scanf("%d",&x);
while(x != -1){
temp = search(sl,n,x);
if(temp == -1){
printf("没有该元素!\n");
}else{
printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
}
printf("请输入要查找的元素!(-1结束)\n");
scanf("%d",&x);
}
return 0;
}
2、折半查找(二分查找)
#include <stdio.h>
#define MAXSIZE 20
typedef struct{
int key;
int otherData;
}SeqList;
SeqList temp;
void sort(SeqList sl[],int n){
for(int i=0;i<n-1;i++){
for(int j=0;j<n-i-1;j++){
if(sl[j].key > sl[j+1].key){
temp = sl[j];
sl[j] = sl[j+1];
sl[j+1] = temp;
}
}
}
}
int binSearch(SeqList sl[],int n,int x){
int low = 0;
int high = n-1;
int mid;
while(low <= high){
mid = (low + high)/2;
if(sl[mid].key == x){
return mid;
}else if(sl[mid].key < x){
low = mid+1;
}else{
high = mid-1;
}
}
return -1;
}
int main(){
int n,x,temp;
SeqList sl[MAXSIZE];
printf("请输入元素的个数!\n");
scanf("%d",&n);
for(int t=0;t<n;t++){
sl[t].otherData = 0;
}
printf("请输入所有的元素!\n");
for(int i=0;i<n;i++){
scanf("%d",&sl[i].key);
}
printf("列表中的元素是:\n");
for(int j=0;j<n;j++){
printf("%d ",sl[j].key);
}
printf("\n");
printf("对列表中的元素排序之后输出的结果是:\n");
sort(sl,n);
for(int k=0;k<n;k++){
printf("%d ",sl[k].key);
}
printf("\n");
printf("请输入要查找的元素!(-1结束)\n");
scanf("%d",&x);
while(x != -1){
temp = binSearch(sl,n,x);
if(temp == -1){
printf("没有该元素!\n");
}else{
printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
}
printf("请输入要查找的元素!(-1结束)\n");
scanf("%d",&x);
}
return 0;
}
3、分块查找
#include <stdio.h>
typedef struct{
int key;
int otherData;
}SeqList;
typedef struct{
int maxKey;
int index;
}IndexList;
int search(SeqList sl[],int x,int total,IndexList il[],int n){
int low = 0;
int high = n-1;
int mid;
int i,j;
while(low <= high){
mid = (low + high)/2;
if(il[mid].maxKey >= x){
high = mid - 1;
}else{
low = mid + 1;
}
}
if(low < n && low+1 != n){ //在这里要考虑low == 3的情况,当low等于3的时候low+1越界,所以low+1=n的情况需要单独判断
i = il[low].index;
j = il[low+1].index-1;
while(i <= j && sl[i].key != x){
i++;
}
if(i <= j){
return i;
}
}else if(low+1 == n){
i = il[low].index;
while(sl[i].key != x && i<total){
i++;
}
if(i<total){
return i;
}
}
return -1;
}
int main(){
int x,temp;
SeqList sl[] = {19,0,7,0,11,0,12,0,23,0,33,0,22,0,40,0,21,0,63,0,74,0,79,0,92,0,80,0,83,0,94,0};
IndexList il[] = {19,0,40,4,79,9,94,12};
printf("请输入要查找数据!\n");
scanf("%d",&x);
while(x != -1){
temp = search(sl,x,16,il,4);
if(temp == -1){
printf("没有该元素!\n");
}else{
printf("元素%d是列表中的第%d个元素。\n",x,temp+1);
}
printf("请输入要查找数据!\n");
scanf("%d",&x);
}
return 0;
}
对于一组非递增或递减的数据,使用第一种顺序查找的方式;对于递增或递减的一组数据使用折半查找的方式效率更高,查找的次数更少;而第三种分块查找虽然在小范围内可以没有顺序,但是大的方向上依然是有顺序的,而且还需要额外的建立一张索引表。所以在选择查找方式的时候要根据数据具体地情况而定。