回 帖 发 新 帖 刷新版面

主题:谢谢各位关注

小弟想实现2_路插入排序
下面这个怎么都最多只能排4个记录的
只要记录数量超过4就不好用了
问题已经解决,谢谢.

#include"stdio.h"
#include"alloc.h"
#include"conio.h"
#define MAX 100
struct Red
{
 int key;
};
struct SqList
{
struct Red r[MAX+1];
int length;
};
void serchloc(struct Red d[],struct Red rc,int l,int h,int *loc)
{//折半查找插入位置,用loc返回
 int m;
  while(l<=h)
 {
 m=(l+h)/2;
 if(rc.key<d[m].key)
 h=m-1;
 else
 l=m+1;
 }
 *loc=h;
}
void BinInsertSort(struct SqList *L)
{
 int i,j,first=1,final=1,len,*loc;//first,final 分别指向d[]有序区的头和尾
 struct Red d[MAX+1];//d为循环向量暂存排序记录
 loc=(int *)malloc(sizeof(int));//整型指针用于记录查找的插入位置
 d[1]=L->r[1];
 len=L->length;
 for(i=2;i<=len;i++)
  if(L->r[i].key<d[1].key)//插到d[1]后
   if(first==1)
   {//处理first==1的特殊情况
    d[len]=L->r[i];
    first=len;
    }
   else
   {
   serchloc(d,L->r[i],first,len,loc);
   for(j=first;j<=*loc;j++)
   d[j-1]=d[j];
   d[j-1]=L->r[i];
   first--;
    }
 else//插到d[1]前
 {
  if(final==1)
  {
   d[2]=L->r[i];
   final=2;
   }
  else
  {
   serchloc(d,L->r[i],2,final,loc);
   for(j=final;j>=*loc+1;j--)
   d[j+1]=d[j];
   d[j+1]=L->r[i];
   final++;
  }
 }
 for(i=first,j=1;j<=len;i=i%len+1,j++)
 L->r[j]=d[i];
}
main()
{
int i,n;
struct SqList *L;
clrscr();
L=(struct SqList*)malloc(sizeof(struct SqList));
printf("input n:\n");
scanf("%d",&n);//输入记录数量n
L->length=n;
printf("input keyword:\n");
for(i=1;i<=n;i++)
scanf("%d",&L->r[i].key);//输入记录关键字
printf("your inputing is:\n");
for(i=1;i<=n;i++)
printf("%d ",L->r[i].key);
printf("\n");
BinInsertSort(L);
printf("after sorting the array is:\n");
for(i=1;i<=n;i++)
printf("%d ",L->r[i].key);
printf("\n");
}

回复列表 (共2个回复)

沙发

void serchloc(struct Red d[],struct Red rc,int l,int h,int *loc)
{//折半查找插入位置,用loc返回
 int m;
 m=(l+h)/2;
 while(l<=h)
 {
 if(rc.key<d[m].key)
 h=m-1;
 else
 l=m+1;
 m=(l+h)/2;  //估计少了这个 你的m不变....
 }
 *loc=h;
}

板凳


thank you very much.

我来回复

您尚未登录,请登录后再回复。点此登录或注册