任意输入n个数据,提供各种查找、排序方法供用户选择。
查找:顺序查找、二分法查找、散列(散列函数任选1至2种,包括冲突处理,以拉链法为主)
排序:直接排序、二分法排序、希尔排序、直接选择排序、堆排序、起泡法排序、快速排序
急用,各位高手帮帮忙.在此先谢谢了.
各位高手嫌上面太烦的话,帮我指点下我下面哪里错了:
typedef struct {int key;/*排序码*/
float data;/*其他数据项*/}RecNode;
int seqsearch(RecNode r[],int n,int k)
{/*在顺序表r[n+1]的r[1]到r[n]中顺序查找关键字为k的记录*/
int i=n;
while(r[i].key!=k) i--;
return(i);
}
void insertsorts(RecNode r[],int n)
{/*顺序存储表示的直接插入排序*/
int i,j;
RecNode x;
for(i=1;i<n;i++)
{x=r[i];j=i-1;
while(x.key<r[j].key&&j>=0)
{r[i+1]=r[j];j--;}
r[j+1]=x;
}
}
main()
{int i,n,k,a,x;
RecNode r[100];
printf("请输入你想输入的数据数目:");
scanf("%d",&n);
for(i=0;i<n;i++)
{scanf("%d",&r[i].key);r[i].data=i;}
printf("请选择排序方式\n");
printf("1.直接插入;2.二分法;3.直接选择;4.堆排序;5.起泡;6.快速\n");
scanf("%d\n",&a);
if(a==1) insertsorts(r,n);
printf("请输入你想要查找的数据\n");
scanf("%d\n",&k);
printf("请选择查找方式\n");
printf("1.顺序查找;2.二分法;3.分块;4.散列\n");
scanf("%d\n",&a);
if(a==1) x=seqsearch(r,n,k);
printf("%d",x);
getch();
}
嗯,改正了,不过,还是有问题.程序运行到
printf("1.直接插入;2.二分法;3.直接选择;4.堆排序;5.起泡;6.快速\n");
scanf("%d\n",&a);
的时候随便按个键就退出了.
有没有高手帮我修改下程序呢?昨天弄了一个下午,在main程序那里整合不出来,下面是小函数.
typedef struct{int key;
int link;}IndexNode;
typedef struct{int key;/*关键字*/
float info;/*其他域*/}Elem;
typedef struct node{int key;
struct node*link;}HNode;
typedef struct {int key;/*排序码*/
float data;/*其他数据项*/}RecNode;
int seqsearch(Elem r[],int n,int k)
{/*在顺序表r[n+1]的r[1]到r[n]中顺序查找关键字为k的记录*/
int i=n;
r[0].key=k;
while(r[i].key!=k) i--;
return(i);
}
int binarysearch(Elem r[],int n,int k)
{/*二分法查找算法*/
int i,j,m;
i=0;j=n-1;
while(i<=j)
{m=(i+j)/2;
if(k==r[m].key) return(m);
else if(k<r[m].key j=m-1;
else i=m+1;
}
return(-1);
}
int blocksearch(Elem r[],IndexNode nd[],int b,int k,int n)
{/*用顺序查找确定结点所在块的分块查找算法*/
int j,i=0;
while((k>nd[i].key)&&(i<b)) i++;
if(i>=b){printf(“\n not found”);return(0);}
j=nd[i].link;
while((j<n)&&(k!=r[j].key)&&(r[j].key<=nd[i].key)) j++;
if(k!=r[j].key){j=-1;printf(“\n not found”);}
return(j);
}
int h(int k)
{return(k%5);}
HNode *linksearch(HNode *t[],int k)
{/*在用拉链表法处理冲突的散列表t中查找关键字为给定值k的记录*/
HNode *p;
int i;
i=h(k);
if(t[i]==NULL) return(NULL);
p=t[i];
while(p!=NULL)
{if(p->key==k) return(p);
esle p=p->link;}
return(NULL);
}
void insertsorts(RecNode r[],int n)
{/*顺序存储表示的直接插入排序*/
int i,j;
RecNode x;
for(i=1;i<n;i++)
{x=r[i];j=i-1;
while(x.key<r[j].key&&j>=0)
{r[i+1]=r[j];j--;}
r[j+1]=x;
}
}
void binsort(RecNode r[],int n)
{/*二分法插入排序*/
int i,j,m,t,w;
RecNode x;
for(i=1;i<n;i++)
{x=r[i];
t=0;w=i-1;
while(t<=w)
{m=(t+w)/2;
if(x.key<r[m].key) w=m-1;
else t=m+1;}
for(i=i-1;j>=t;j--;)
{r[j+1]=r[j];}
r[t]=x;
}
}
}
void shellsort(RecNode r[],int n)
{/*希尔排序*/
RecNode x;
int i,j,d;
d=n/2;
while(d>0)
{for(i=d;i<n;i++)
{x=r[i];j=i-d;
while((j>=0)&&(x.key<r[j].key))
{r[j+d]=r[j];j-=d;}
r[j+d]=x;}
d=d/2;
}
}
void selectsort(RecNode r[],int n)
{/*直接选择排序*/
int i,j,k;
RecNode x;
for(i=0;i<n-1;i++)
{k=i;
for(j=i+1;j<n;j++)
{if(r[j].key<r[k].key) k=j;}
if(i!=k)
{x=r[i];r[i]=r[k];r[k]=x;}
}
}
void sift(RecNode r[],int t,int w)
{/*用筛选法调整堆*/
int i,j;
RecNode x;
i=t;
x=r[i];
j=2*i+1;
while(j<=w)
{if((j<w)&&(r[j].key>r[j+1].key))
{ j++; }
if(x.key>r[j].key)
{r[i]=r[j];i=j;j=2*j+1;}
else break;
}
r[i]=x;
}
void heapsort(RecNode r[],int n)
{/*堆排序*/
int i;
RecNode x;
for(i=n/2-1;i>=0;i--) sift(r,i,n-1);
for(i=n-1;i>0;i--)
{x=r[0];r[0]=r[i];r[i]=x;
sift(r,0,i-1);
}
}
void bubblesort(RecNode r[],int n)
{/*起泡排序*/
int i,j,k;
RecNode x;
for(j=0;j<n-1;j++)
{k=0;
for(i=0;i<n-j-1;i++)
{if(r[i+1].key<r[i].key)
{k++;x=r[i];r[i]=r[i+1];r[i+1]=x;}
if(k==0) break;
}
}
void quicksortr(RecNode r[],int t,int w)
{/*快速排序递归算法*/
int i,j,k;
RecNode x;
if(t>=w) return;
i=t;j=w;x=r[i];
do{while((r[j].key>=x.key)&&(j>i)) j--;
if(i<j){r[i]=r[j];i++;}
while((r[i].key<=x.key)&&(j>i)) i++;
if(i<j){r[j]=r[i];j--;}
}while(i<j);
r[i]=x;
quicksortr(r,t,i-1);
quicksortr(r,i+1,w);
}
在main函数那里不知怎样整合.-_-!!