排序问题

hw19886200 2010-08-11 01:34:11
我用快速排序对链表进行排序 排序拍好后不能正常结束 大家帮我看看看 谢谢了
typedef struct _data
{
int iScore;
char cName[12];
struct _data *dNext,*dPrior;
}DATA;

void  SortCycleList(DATA *dPoint)
{
DATA *dLow,*dHigh;
dLow=dPoint->dNext;
dHigh=dPoint->dPrior;
QUickSort(dPoint,dLow,dHigh);
}
void QUickSort(DATA *dPoint,DATA *dLow,DATA *dHigh)
{
DATA *dCount;
while(dLow->dPrior!=dHigh&&dLow!=dHigh&&dLow->dNext!=dHigh)
{
dCount=Partition(dPoint,dLow,dHigh);
QUickSort(dPoint,dLow,dCount->dPrior);
QUickSort(dPoint,dCount->dNext,dHigh);
}
}
DATA *Partition(DATA *dPoint,DATA *dLow,DATA *dHigh)
{
int iScore;
char cName[12];
iScore=dLow->iScore;
strcpy(cName,dLow->cName);
while (dLow!=dHigh)
{
while(iScore<=dHigh->iScore&&dLow!=dHigh)
dHigh=dHigh->dPrior;
dLow->iScore=dHigh->iScore;
strcpy(dLow->cName,dHigh->cName);
while(iScore>dLow->iScore&&dLow!=dHigh)
dLow=dLow->dNext;
strcpy(dHigh->cName,dLow->cName);
dHigh->iScore=dLow->iScore;
}
dLow->iScore=iScore;
return dLow;
}
...全文
126 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykwfly 2010-08-12
  • 打赏
  • 举报
回复
书上都有代码的 对照看看!
sxdkxgwan 2010-08-12
  • 打赏
  • 举报
回复
找一本数据结构的书看看,有的有代码,看看可能就好了
qazwhl845174869 2010-08-11
  • 打赏
  • 举报
回复
嗯!这个有点混乱啊!唉,帮顶吧!
qifeifei 2010-08-11
  • 打赏
  • 举报
回复
这种问题真的不想再看了,很基本的东西啊。
angel_su 2010-08-11
  • 打赏
  • 举报
回复
觉得既然都搞链表了,排序用交换key值方式不好,因为可能设计很大很多的说...还是修正指针为好,网搜一些教程代码看看,细细理解一下应该不难...
SoullessL 2010-08-11
  • 打赏
  • 举报
回复
新手每天看帖学习,总结经验,学习
失落的凡凡 2010-08-11
  • 打赏
  • 举报
回复

typedef struct _data
{
int iScore;
char cName[12];
struct _data *dNext,*dPrior;
}DATA;

void DATA_swap(DATA* pData1, DATA* pData2)
{
if(pData1 == pData2)
return;
int iOldData1Score = pData1->iScore;
pData1->iScore = pData2->iScore;
pData2->iScore = iOldData1Score;

char cOldData1Name[12];
memcpy(cOldData1Name, pData1->cName, 12);
memcpy(pData1->cName, pData2->cName, 12);
memcpy(pData2->cName, cOldData1Name, 12);
}

void QUickSort(DATA *dLow,DATA *dHigh);
void SortCycleList(DATA *dPoint)
{
DATA *dLow,*dHigh;
dLow=dPoint->dNext;
dHigh=dPoint->dPrior;
QUickSort(dLow,dHigh);
}

DATA *Partition(DATA *dLow,DATA *dHigh);
void QUickSort(DATA *dLow,DATA *dHigh)
{
DATA *dCount=Partition(dLow,dHigh);
if(dLow != dCount && dLow != dCount->dPrior)
QUickSort(dLow,dCount->dPrior);
if(dHigh != dCount && dHigh != dCount->dNext)
QUickSort(dCount->dNext,dHigh);
}
DATA *Partition(DATA *dLow,DATA *dHigh)
{
DATA* Mid= dLow;
int iScore = dHigh->iScore;
for (DATA* i= dLow; i != dHigh; i = i->dNext)
{
if( iScore < i->iScore)
{
DATA_swap(Mid, i);
Mid = Mid->dNext;
}
}
DATA_swap(Mid , dHigh);
return Mid;
}
失落的凡凡 2010-08-11
  • 打赏
  • 举报
回复
看了半天越看越糊涂 这哪是什么快排啊 逻辑全不对嘛
失落的凡凡 2010-08-11
  • 打赏
  • 举报
回复
Partition为什么需要三个参数呢?

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧