查找 | 二分查找/折半查找

//二分查找法
#include <stdio.h>
#define MaxSize 8
typedef struct
{
  int stuno;
  char stuname[20];
}TableElem;

TableElem stu[]={{1001,"zhang"},{1009,"wang"},{2005,"sun"},{2008,"liu"},{3001,"zheng"},
{3005,"lai"},{4003,"qin"},{4400,"ren"}};

typedef struct
{
  TableElem elem[MaxSize];
  int n;
}SqTable;

//二分查找函数
int bin_search(SqTable T,int key)
{
  int low,high,mid;
  low=1;
  high=T.n;

  while(low<high)
  {
    mid=(low+high)/2;
    if(T.elem[mid].stuno==key)
      return mid;
    else if(key<T.elem[mid].stuno)
      high=mid-1;
    else
      low=mid+1;
  }
  return 1;
}

/*
int searchsqtable(SqTable T,int key) //查找函数
{
  T.elem[0].stuno=key;
  int i=T.n;
  while(T.elem[i].stuno!=key)
    i--;
  return i;
}
*/

//选择排序
void select_sort(SqTable T,int nn)
{
  int min,i,j;
  TableElem temp;
  for(i=0;i<nn-1;i++)
  {
    min=i;
    for(j=i+1;j<nn;j++)
    {
      if(T.elem[j].stuno<T.elem[j+1].stuno)
        min=j;
    }
    if(min!=j)
    {
      temp=T.elem[min];
      T.elem[min]=T.elem[i];
      T.elem[i]=temp;
    }
  }
}
int main()
{
  SqTable seq;
  for(int i=0;i<MaxSize;i++)
  {
    seq.elem[i]=stu[i]; //用stu[8]8个人初始化elem[8]数组
  }
  seq.n=MaxSize;

//8个人按学号排序
  int n=MaxSize;
  select_sort(seq,n);

  for(i=0;i<MaxSize;i++)
    printf("%d %s ",seq.elem[i].stuno,seq.elem[i].stuname);

  int kk,mm;
  printf("请输入要查找的学号:");
  scanf("%d",&kk);
  mm=bin_search(seq,kk); //调用查找函数
  printf("此人在顺序表中的位置是:%d ",mm+1);
  printf("%d号的姓名为:%s ",mm+1,seq.elem[mm].stuname);
  return 1;
}

原文地址:https://www.cnblogs.com/billie52707/p/11904099.html