数据结构-基本功能函数-向量

来源:互联网 发布:蒙哥马利算法 编辑:程序博客网 时间:2024/04/29 21:21
 //------------------------------------------------
//向量
int finsert_add(VECTOR array,int number,ElemType value)
{//将value按由小到大的顺序插入到向量array中,number指元素个数
 int i,j;
 for(i=0;i<number&&array[i]<value;i++);
 for(j=number-1;j>=i;j--)array[j+1]=array[j];
 array[i]=value;
 return ++number;
}
int fsector_deletesame(VECTOR array,int number)
{//删除向量array中有多余相同值,number为元素个数
 int i=0,j;
 ElemType prevalue,value;
 prevalue=array[0];
    for(i=1;i<number;i++)
 {
  value=array[i];
  if(prevalue==value)
  {
   for(j=i;j<number;j++)
    array[j]=array[j+1];
   array[number-1]=0;
   --number;
   --i;
  }
  else;
  prevalue=value;
 }
 return number;
}
void fsector_split(VECTOR array1,int number1,VECTOR array2,int *number2,VECTOR array3,int *number3)
{//将array1中大于0的值放在array2,小于等于0的值放在array3
 int i=0,j=0,k=0;
 for(i=0;i<number1;i++)
  if(array1[i]>0)
   array2[j++]=array1[i];
  else
   array3[k++]=array1[i];
 *number2=j;
 *number3=k;
}
void fsector_exchange(VECTOR array,int first_local,int end_local)
{//将向量array中从first_local到end_local的元素倒叙
 int i,j,mid,temp;
 mid=(first_local+end_local)/2;
 for(i=first_local,j=end_local;i<=mid;i++,j--)
 {
  temp=array[i];
     array[i]=array[j];
  array[j]=temp;
 }
}
void fsector_changeplace(VECTOR array1,int number2,int number3)
{//array1向量长度等于number2+number3,其中number2,number3分别为array2,array3的向量长度
 //number3,number2分别存放前后array1数
 fsector_exchange(array1,0,number3+number2-1);
 fsector_exchange(array1,0,number2-1);
 fsector_exchange(array1,number2,number3+number2-1);
}
//
int ffind_local(VECTOR array,ElemType value,int number)
{//折半查找法
 int low=0,high=number-1,mid;
 while(low<=high)
 {
  mid=(low+high)/2;
  if(value>array[mid])low=mid+1;
  else if(value==array[mid])return mid;
  else
   high=mid-1;
 }
 return ERROR;
}
int fdelete_value(VECTOR array,ElemType x,ElemType y,int number)
{//删除array中从 x到y的值(x<=y),number为array的元素个数
 int local_x,local_y,k1,k2,i;
 local_x=ffind_local(array,x,number);
 local_y=ffind_local(array,y,number);
    k2=number-local_y;
 k1=local_y-local_x+1;
 for(i=0;i<6;i++)
  array[local_x+i]=array[++local_y];
 array[++local_y]=0;
 return number-k1;
}
void fcompositor(VECTOR array,int number)
{//对向量array按由大到小的顺序进行折半插入排序
 int i,j;
 int p1;
 int low,high,mid;
 for(i=1;i<number;i++)
 {
  p1=array[i];
  low=0;
  high=i-1;
  while(low<=high)
  {
   mid=(low+high)/2;
   if(p1<array[mid])high=mid-1;
   else
    low=mid+1;
  }
  for(j=i-1;j>=low;j--)
   array[j+1]=array[j];
  array[low]=p1;
 }
}
void ffind_max_min(VECTOR array,ElemType max,ElemType min,int number)
{//查找最大最小值,并且平均比较次数小于3n/2
 int i;
 max=min=array[0];
 for(i=1;i<number;i++)
  if(array[i]>max)max=array[i];
  else if(array[i]<min)min=array[i];
}
int fcompare_function(VECTOR array1,int number1,VECTOR array2,int number2)
{
 int i,k=0;
 for(i=0;i<number1&&i<number2&&array1[i]==array2[i];i++);
 if(i==number1&&number1==number2)return 0;
 else if(i==number1&&i<number2||i<number1&&i<number2&&array1[i]<array2[i])
  return -1;
 else
  return 1;
}
int fcompostitute(VECTOR array1,int number1,VECTOR array2,int number2,VECTOR array3)
{//按由小到大的顺序合并两个由小到大排列的向量
 int i,j;
 int low=0,high,mid,local_old=0;
 int p1=0;
 for(i=0;i<number1;i++)
 {
  high=number2;
  while(low<=high)
  {
   mid=(low+high)/2;
   if(array1[i]<array2[mid])high=mid-1;
   else
    low=mid+1;
  }
  for(j=local_old;j<low;j++)
   array3[p1++]=array2[j];
  local_old=low;
  array3[p1++]=array1[i];
 }
 for(;p1<number1+number2;p1++)array3[p1]=array2[local_old++];
 return number1+number2;
}
//------------------------------------------------
原创粉丝点击