1. 设计一个算法,使左半部分小于k,右半部分大于k(16年)
void division(int a[],int n,int key){
int low=0,high=n-1;
int p=a[low];
while(low<=high){
while(low<high && a[high]>=key)
high--;
a[low]=a[high];
while(low<high && a[low]<=key)
low++;
a[high]=a[low];
}
a[low]=p;
}
2. 设计算法,对n个关键字取实数值的记录序列进行整理,以使所有关键字为负值的记录排在非负值的记录之前(18年)
void Divide(int a[],int n){
low=0;high=n-1;
while(low<=high){
while(a[high]>=0)
high--;
a[low]=a[high];
while(a[low]<0)
low++;
a[high]=a[low];
}
}
3. 设计在顺序有序表中实现折半查找的算法(13年)
int bisearch(int r[],int n,int k){
int low=0,mid,high=n-1;
while(low<=high){
mid=(low+high)/2;
if(r[mid].key==k)
return mid;
else if(r[mid]>k)
high=mid-1;
else low=mid+1;
}
return -1;
}
4. 试编写一个算法,使能在数组[1…n]中找出第k小的元素(从小到大排序)
int kth_elem(int a[],int low,int high,int k){
int pivot=a[low];
int low_temp=low;
int high_temp=high;
while(low<high){
while(low<high && a[high]>=pivot){
--high;
a[low]=a[high];
while(low<high &&a[low]<=pivot)
++low;
a[high]=a[low];
}
a[low]=pivot;
}
if(low==k)
return a[low];
else if(low>k)
return kth_elem(a,low_temp,low-1,k);
else
return kth_elem(a,low+1,high_temp,k-low);
}
5. 冒泡排序法升序排列a[1],a[2]…a[n]序列
void bsort(Node a[],int n){
Node temp;
int i,j,temp;
for(j=1;j<n && flag==1;j++){
flag==0;
for(i=1;i<j;i++){
if(a[i].key>a[i+1].key){
flag==1;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
if(flag==0) break;
}
}
}