#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 InsertSort ( SqList *L ) |
{ |
int i,j; |
for ( i=2; i<=L->length; ++i ) |
if ( LT ( L->r[i].key,L->r[i-1].key ) ) |
{ |
L->r[0]=L->r[i]; |
for ( j=i-1; LT ( L->r[0].key,L->r[j].key ); --j ) |
L->r[j+1]=L->r[j]; |
L->r[j+1]=L->r[0]; |
} |
} |
void BInsertSort ( SqList *L ) |
{ |
int i,j; |
int low,high,m; |
for ( i=2; i<=L->length; ++i ) |
{ |
L->r[0]=L->r[i]; |
low=1; |
high=i-1; |
while ( low<=high ) |
{ |
m= ( low+high ) /2; |
if ( LT ( L->r[0].key,L->r[m].key ) ) |
high=m-1; |
else low=m+1; |
} |
for ( j=i-1; j>=high+1; --j ) |
L->r[j+1]=L->r[j]; |
L->r[high+1]=L->r[0]; |
} |
} |
/* QuickSort related function */ |
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; |
} |
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 ); |
} |
} |
void QuickSort ( SqList *L ) |
{ |
QSort ( L,1,L->length ); |
} /* End QuickSort related function*/ |
/*SelectSort related function */ |
int SelectMinKey ( SqList L, int i ) |
{ |
int k; |
int j; |
k=i; |
for ( j=i; j<L.length+1; j++ ) |
if ( L.r[k].key>L.r[j].key ) |
k=j; |
return k; |
} |
void SelectSort ( SqList *L ) |
{ |
RedType t; |
int i,j; |
for ( i=1; i<L->length; ++i ) |
{ |
j=SelectMinKey ( *L,i ); |
if ( i!=j ) |
{ |
t=L->r[i]; |
L->r[i]=L->r[j]; |
L->r[j]=t; |
} |
} |
} /*End SelectSort related function */ |
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; |
} |
void HeapSort ( HeapType *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 ); |
} |
} |
main() |
{ |
int a[]={49,38,65,97,76,13,27,49}; |
int i,k; |
SqList s; |
printf ( "\nThe record to be sort:\n" ); |
for ( i=1; i<9; i++ ) |
{ |
s.r[i].key=a[i-1]; |
printf ( "%d " ,a[i-1] ); |
} |
s.length=i-1; |
printf ( "\n\t1,InsertSort\n\t2,BInsertSort\n\t3,QuickSort\n\t4,SelectSort\n" ); |
printf ( "\t5,HeapSort\n\tPress 1..5 to select a function\n" ); |
scanf ( "%d" ,&k ); |
switch ( k ) |
{ |
case 1: |
InsertSort ( &s ); |
break ; |
case 2: |
BInsertSort ( &s ); |
break ; |
case 3: |
QuickSort ( &s ); |
break ; |
case 4: |
SelectSort ( &s ); |
break ; |
case 5: |
HeapSort ( &s ); |
break ; |
default : |
printf ( "No function which you select.\n" ); |
} |
printf ( "\nThe records be sorted:\n" ); |
for ( i=1; i<9; i++ ) |
printf ( "%d " ,s.r[i].key ); |
printf ( "\n\n\tPress any key to exit.\n" ); |
getch(); |
} |
by: 发表于:2018-01-25 09:41:44 顶(0) | 踩(0) 回复
??
回复评论