一、二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
所以对于实际的应用,当插入元素的时候,需要将大于插入的元素全部迁移一位,当相应的数组个数较多的时候,可能迁移效率较低。
二、实战
#include <stdio.h>
#include <stdlib.h>
#define MAX_ARRAY_NUM 1000
typedef struct
{
int num;
int id[MAX_ARRAY_NUM];
}IDLIST;
IDLIST g_idlist;
int Binary_Search_ID_Pos(int id,int *pos)
{
int ipos = 0;
int istart = 0;
int iend = 0;
if(NULL == pos)
{
return -2;
}
istart = 0;
iend = g_idlist.num -1;
ipos = ( istart + iend )>>1;
while ( istart <= iend )
{
if (id == g_idlist.id[ipos])
{
*pos = ipos;
break;
}
else if (g_idlist.id[ipos] < id)
{
istart = ipos + 1;
}
else
{
iend = ipos - 1;
}
ipos = ( istart + iend )>>1;
}
if ( istart > iend )
{
*pos = istart;
return -1;
}
else
{
return 0;
}
}
int Add_id_to_list( int id )
{
int ipos = 0;
int i = 0;
int ret = -1;
if ( g_idlist.num >= MAX_ARRAY_NUM)
{
return -1;
}
ret = Binary_Search_ID_Pos(id, &ipos);
if ( 0 == ret)
{
return 0;
}
if ( -1 != ret)
{
return -1;
}
for ( i = g_idlist.num; i > ipos ; i-- )
{
g_idlist.id[i] = g_idlist.id[i-1] ;
}
g_idlist.id[i] = id;
g_idlist.num++;
return 0;
}
int Del_id_from_list( int id )
{
int ipos = 0;
int i = 0;
if ( g_idlist.num == 0)
{
return -1;
}
if ( 0 == Binary_Search_ID_Pos(id, &ipos))
{
for ( i = ipos; i < g_idlist.num; i ++)
{
g_idlist.id[i] = g_idlist.id[i+1] ;
}
g_idlist.id[i-1] = 0;
g_idlist.num--;
return 0;
}
else
{
return -1;
}
}
void ShowIdListInfo()
{
int i = 0;
printf("num:%d\n",g_idlist.num);
for(;i < MAX_ARRAY_NUM;i++)
{
printf("id%d:%d\n",i,g_idlist.id[i]);
}
}
int main()
{
int i = 0;
for(i=0;i < MAX_ARRAY_NUM;i++)
{
Add_id_to_list(i*2);
}
ShowIdListInfo();
for(i=0;i < MAX_ARRAY_NUM;i++)
{
Del_id_from_list(i*2);
}
ShowIdListInfo();
}