快新文新一怀孕离开:请教内部排序问题,有一个错误,不知道怎么修改..

来源:百度文库 编辑:高校问答 时间:2024/05/08 20:23:09
#include "stdio.h"
#include "stdafx.h"
#include "iostream.h"
#define MAXSIZE 20
#define LT(a,b) ((a)<(b))
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}SqList;
void ShellInsert(SqList &L){
//对顺序表L作一趟希尔插入排序。
int i,j;
int dk;
for(i=dk+1;i<=L.length;++i)
if(LT(L.r[i].key,L.r[i-dk].key)){

L.r[0]=L.r[i];
for (j=i-dk; j>0&<(L.r[0].key, L.r[j].key); j-=dk)
L.r[j+dk]=L.r[j];
L.r[j+dk]=L.r[0];
}

}
int Partition(SqList *L,int low, int high){
//对顺序表做快速排序。
int pivotkey;
L->r[0]=L->r[low];
pivotkey=L->r[low].key;
while(low<high){

while(low<high&&L->r[high].key>=pivotkey) --high;
L->r[low]=L->r[high];
while(low<high&&L->r[low].key<=pivotkey) ++low;
L->r[high]=L->r[low];
}
L->r[low]=L->r[0];
return low;
}//Partition
void QSort(SqList *L,int low,int high)
{int pivotloc;
if(low<high){

pivotloc=Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);

}

}//QSort
void QuickSort(SqList *L){
//对顺序表L作快速排序。
QSort(L,1,L->length);
}//QuickSort
typedef SqList HeapType;//堆排序
void HeapAdjust(HeapType &H,int s, int m)
{

RedType rc;
int j;
rc=H.r[s];
for(j=2*s;j<=m;j*=2)
{
if(j<m&<(H.r[j].key, H.r[j+1].key)) ++j;
if(!LT(rc.key,H.r[j].key)) break;
H.r[s]=H.r[j];
s=j;
}
H.r[s]=rc;
}//HeapAdjust
void HeapSort(HeapType &H)
{
//对顺序表H进行堆排序。
RedType t;
int i;
for(i=H.length/2;i>0;--i)
HeapAdjust(H,i,H.length);
for(i=H.length;i>1;--i)
{
t=H.r[1];
H.r[1]=H.r[i];
H.r[i]=t;
HeapAdjust(H,1,i-1);
}

}//HeapSort
void Merge(RedType r[],int h ,int m,int w,RedType t[])
{

int i,j,k;
i=h; j=m+1; k=h-1;//k指向t[]的当前元素,开始时为0.
while((i<=m)&&(j<=w))
{
k++;
if(r[i].key<=r[j].key)t[k]=r[i++];
else t[k]=r[i++];
}
if(i>m)while(j<=w)t[++k]=r[j++];
else while(i<=m)t[++k]=r[i++];

}//Merge

void MergePass(int s, int n,RedType r[],RedType t[])
{
//一趟归并
int i=0;
while(i<(n-2*s+1))
{
Merge(r,i,i+s-1,i+2*s-1,t);
i=i+2*s;
}
if(i<(n-s))
Merge(r,i,i+s-1,n-1,t);
else
while(i<n)t[i]=r[i++];
}//MergePass
#define M 100
void MergeSort(SqList *L){
//对顺序表作2路归并排序。
int i,s=1;

RedType r[M];

int n;
RedType t[M];
while (s<n)
{
MergePass(s,n,r,t); s*=2;
if(s<n)
{MergePass(s,n,t,r);s*=2;}
else
{
i=0;
while(i<n)
r[i]=t[i++];
}

}

}//MergeSort
void main()
{
int a[]={49,38,65,97,76,13,27};
int i,k;
SqList s;
HeapType t;
HeapType r;
cout<<"\nThe record to be sort:"<<endl;
for(i=1;i<9;i++)
{
s.r[i].key=a[i-1];
cout<<a[i-1];

}
s.length=i-1;
cout<<"1----ShellSort\n"
<<"2----QuickSort\n"
<<"3----HeapSort\n"
<<"4----MergeSort\n";
cin>>k;
switch(k){
case 1:
ShellInsert(&s);
break;
case 2:
QuickSort(&s);
break;
case 3:
HeapSort(t);
break;
case 4:
MergeSort(&s);
break;
default:cout<<"NO function which you select.\n";
}
cout<<"the records be sorted:\n";
for(i=1;i<9;i++)
{ cout<< "\npress any key to exit." <<endl;}

}

看一个说一个

这里
while(low<high&&L->r[high].key>=pivotkey) --high;
两个条件起本质是是一样的,
因为前面你有这句
pivotkey=L->r[low].key;

说真的,难怪没人回答,问题挑战性大,居然才5分
呵呵