来源:网络
#include < stdio.h >
#include < stdlib.h >
struct node
{
int key;
}r[ 20 ];
struct rnode
{
int key;
int point;
};
main()
{
void print( struct node a[ 20 ], int n);
int creat();
void shell( struct node a[ 20 ], int n);
int hoare( struct node a[ 20 ], int l, int h);
void quick1( struct node a[ 20 ], int n);
void quick2( struct node a[ 20 ], int l, int h);
void heap( struct node a[ 20 ], int i, int m);
void heapsort( struct node a[ 20 ], int n);
void merges( struct node a[ 20 ], struct node a2[ 20 ], int h1, int mid, int h2);
void mergepass( struct node a[ 20 ], struct node a2[ 20 ], int l, int n);
void mergesort( struct node a[ 20 ], int n);
int yx( int m, int i);
int radixsort( struct rnode a[ 20 ], int n);
int num,l,h,c;
struct rnode s[ 20 ];
c = 1 ;
while (c != 0 )
{
printf( " 主菜单 \n " );
printf( " 1 输入关键字,以-9999表示结束。\n " );
printf( " 2 希尔排序 \n " );
printf( " 3 非递归的快速排序 \n " );
printf( " 4 递归的快速排序 \n " );
printf( " 5 堆排序 \n " );
printf( " 6 归并排序 \n " );
printf( " 7 基数排序 \n " );
printf( " 输入选择 (1--7,0表示结束): " );
scanf( " %d " , & c);
switch (c)
{
case 1 :num = creat();print(r,num); break ;
case 2 :shell(r,num);print(r,num); break ;
case 3 :quick1(r,num);print(r,num); break ;
case 4 :l = 0 ;h = num - 1 ;quick2(r,l,h);
printf( " output quick2sort result:\n " );
print(r,num); break ;
case 5 :heapsort(r,num); break ;
case 6 :mergesort(r,num);print(r,num); break ;
case 7 :radixsort(s,num);
}
}
} // main end
void print( struct node a[ 20 ], int n)
{
int i;
for (i = 0 ;i < n;i ++ )
printf( " %5d " ,a[i ].key);
printf( " \n " );
} // print end
int creat()
{
int i,n;
n = 0 ;
printf( " input keys " );
scanf( " %d " , & i);
while (i !=- 9999 )
{
r[n].key = i;
n ++ ;
scanf( " %d " , & i);
}
return (n);
} // creat end
void shell( struct node a[ 20 ], int n) // 希尔排序
{
int i,j,k;
for (i = n;i >= 1 ;i -- )
a[i].key = a[i - 1 ].key;
k = n / 2 ;
while (k >= 1 )
{
for (i = k + 1 ;i <= n;i ++ )
{
a[ 0 ].key = a[i].key;
j = i - k;
while ((a[j].key > a[ 0 ].key) && (j >= 0 ))
{
a[j + k].key = a[j].key;
j = j - k;
}
a[j + k] = a[ 0 ];
}
k = k / 2 ;
}
for (i = 0 ;i < n;i ++ )
a[i].key = a[i + 1 ].key;
printf( " 输出希尔排序的结果:\n " );
} // shell end
////////////////// //快速排序 ///////////////////////////
int hoare( struct node a[ 20 ], int l, int h) // 分区处理函数
{
int i,j;
struct node x;
i = l;
j = h;
x.key = a[i].key;
do
{
while ((i < j) && (a[j].key >= x.key))
j -- ;
if (i < j)
{
a[i].key = a[j].key;
i ++ ;
}
while ((i < j) && (a[i].key <= x.key))
i ++ ;
if (i < j)
{
a[j].key = a[i].key;
j -- ;
}
} while (i < j);
a[i].key = x.key;
return (i);
} // hoare end
void quick1( struct node a[ 20 ], int n)
{
int i,l,h,tag,top;
int s[ 20 ][ 2 ];
l = 0 ;h = n - 1 ;tag = 1 ;top = 0 ;
do
{
while (l < h)
{
i = hoare(a,l,h);
top ++ ;
s[top][ 0 ] = i + 1 ;
s[top][ 1 ] = h;
h = h - 1 ;
}
if (top == 0 )
tag = 0 ;
else
{
l = s[top][ 0 ];
h = s[top][ 1 ];
top -- ;
}
} while (tag == 1 );
printf( " 输出非递归快速排序结果:\n " );
} // quick end
void quick2( struct node a[ 20 ], int l, int h) // 递归的快速排序
{
int i;
if (l < h)
{
i = hoare(a,l,h);
quick2(a,l,i - 1 );
quick2(a,i + 1 ,h);
}
} // quick2 end
////////////////// //快速排序结束 ////////////////////////
////////////////// //堆排序函数 //////////////////////// //
void heap( struct node a[ 20 ], int i, int m) // 调整堆的函数
{
struct node x;
int j;
x.key = a[i].key;
j = 2 * i;
while (j <= m)
{
if (j < m)
if (a[j].key > a[j + 1 ].key)
j ++ ;
if (a[j].key < x.key)
{
a[i].key = a[j].key;
i = j;
j = 2 * i;
}
else
j = m + 1 ;
}
a[i].key = x.key;
} // heap end
void heapsort( struct node a[ 20 ], int n) // 堆排序的主体函数
{
int i,v;
struct node x;
for (i = n;i > 0 ;i -- )
a[i].key = a[i - 1 ].key;
for (i = n / 2 ;i >= 1 ;i -- )
heap(a,i,n);
printf( " 输出堆排序结果:\n " );
for (v = n;v >= 2 ;v -- )
{
printf( " %5d " ,a[ 1 ].key);
x.key = a[ 1 ].key;
a[ 1 ].key = a[v].key;
a[v].key = x.key;
heap(a, 1 ,v - 1 );
}
printf( " %5d " ,a[ 1 ].key);
for (i = 0 ;i < n;i ++ )
a[i].key = a[i + 1 ].key;
} // heapsort end
/////////////// //堆排序函数结束 ////////////////// /
////////////////// 归并函数 ////////////////////////
void merges( struct node a[ 20 ], struct node a2[ 20 ], int h1, int mid, int h2)
// 归并排序的核心算法
{
int i,j,k;
i = h1;j = mid + 1 ;k = h1 - 1 ;
while ((i <= mid) && (j <= h2))
{
k = k + 1 ;
if (a[i].key <= a[j].key)
{
a2[k].key = a[i].key;
i ++ ;
}
else
{
a2[k].key = a[j].key;
j ++ ;
}
}
while (i <= mid)
{
k ++ ;
a2[k].key = a[i].key;
i ++ ;
}
while (j <= h2)
{
k ++ ;
a2[k].key = a[j].key;
i ++ ;
}
} // merges end
void mergepass( struct node a[ 20 ], struct node a2[ 20 ], int l, int n)
// 一趟归并
{
int j,i,h1,mid,h2;
i = 0 ;
while ((n - i) >= 2 * l)
{
h1 = i;
mid = h1 + l - 1 ;
h2 = i + 2 * l - 1 ;
merges(a,a2,h1,mid,h2);
i = i + 2 * l;
}
if ((n - i) <= l)
for (j = i;j <= n;j ++ )
a2[j].key = a[j].key;
else
{
h1 = i;
mid = h1 + l - 1 ;
h2 = n - 1 ;
merges(a,a2,h1,mid,h2);
}
} // mergepass end
void mergesort( struct node a[ 20 ], int n)
{
int l;
struct node a2[ 20 ];
l = 1 ;
while (l < n)
{
mergepass(a,a2,l,n);
l = 2 * l;
mergepass(a2,a,l,n);
l = 2 * l;
}
printf( " 输出归并排序的结果:\n " );
} // mergesort end
/////////////// 归并函数结束 ///////////////
/////////////// 基数排序 ////////////////// /
int yx( int m, int i) // 分离关键字倒数第i位有效数字的算法
{
int x;
switch (i)
{
case 1 :x = m % 10 ; break ;
case 2 :x = (m % 100 ) / 10 ; break ;
case 3 :x = (m % 1000 ) / 100 ; break ;
case 4 :x = (m % 10000 ) / 1000 ; break ;
}
return (x);
} // yx end
int radixsort( struct rnode a[ 20 ], int n)
{
int f[ 11 ],e[ 11 ],i,j,k,l,p,d,t;
for (i = 1 ;i <= n;i ++ )
{
a[i].key = r[i - 1 ].key;
a[i].point = i + 1 ;
}
a[n].point = 0 ;
p = 1 ;
printf( " 输出关键字有效位数 d\n " );
scanf( " %d " , & d);
printf( " 输出基数排序的结果:\n " );
for (i = 1 ;i <= d;i ++ )
{
for (j = 0 ;j <= 10 ;j ++ )
{
f[j] = 0 ;
e[j] = 0 ;
}
while (p != 0 )
{
k = yx(a[p].key,i);
if (f[k] == 0 )
{
f[k] = p;
e[k] = p;
}
else
{
l = e[k];
a[l].point = p;
e[k] = p;
}
p = a[p].point;
}
j = 0 ;
while (f[j] == 0 )
j ++ ;
p = f[j];t = e[j];
while (j < 10 )
{
j ++ ;
while ((j < 10 ) && (f[j] == 0 ))
j ++ ;
if (f[j] != 0 )
{
a[t].point = f[j];
t = e[j];
}
}
a[t].point = 0 ;
t = p;
while (t != 0 )
{
printf( " %5d " ,a[t].key);
t = a[t].point;
}
printf( " \n " );
}
return (p);
}