#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TABLE 50
typedef struct {
char name[15];
int score;
int mingci; }Stud;
typedef struct {
Stud *elem;
int length;
}Student;
void CreateTable( Student &ST ) //建立学生基本情况表
{ int i, sc; char name1[15];
ST.elem = (Stud*)malloc(MAX_TABLE*sizeof(Stud));
ST.length = 0;
printf( “输入学生基本情况(成绩以0表示结束)\n” );
printf( “输入姓名及成绩\n” );
scanf("%s%d",name1,&sc);
while( sc > 0 ) { strcpy( ST.elem[ST.length].name, name1 ); ST.elem[ST.length++].score = sc;
scanf("%s%d",name1,&sc); }
for( i=0; i<ST.length; i++ )
ST.elem[i].mingci = 0; }
void Output( Student ST ) //输出学生的基本情况
{
int i;
printf( “ 姓名 成绩 名次\n” );
for( i =0; i < ST.length; i++ )
printf( “ %10s%6d%6d\n”, ST.elem[i].name, ST.elem[i].score, ST.elem[i].mingci ); printf( “\n” );
}
void InsertSort( Student &ST ) //插入排序
{
int i, j ;
Stud temp;
for( i=1; i< ST.length; i++ )
if( ST.elem[i].score>ST.elem[i-1].score )
{
temp = ST.elem[i];
ST.elem[i] = ST.elem[i-1];
for( j = i-2; j >= 0 && ST.elem[j].score < temp.score; j-- )
ST.elem[j+1] = ST.elem[j];
ST.elem[j+1] = temp;
}
ST.elem[0].mingci = 1;
for( i=1; i < ST.length; i++ )
if( ST.elem[i].score == ST.elem[i-1].score )
ST.elem[i].mingci = ST.elem[i-1].mingci;
else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}
void BubbleSort( Student &ST ) //冒泡排序
{
int i, j;
Stud temp;
for( i = 0; i < ST.length; i++ )
for( j = 0; j < ST.length-i-1; j++ )
if( ST.elem[j].score < ST.elem[j+1].score )
{
temp = ST.elem[j];
ST.elem[j] = ST.elem[j+1];
ST.elem[j+1] = temp;
}
ST.elem[0].mingci = 1;
for( i=1; i < ST.length; i++ )
if( ST.elem[i].score == ST.elem[i-1].score )
ST.elem[i].mingci = ST.elem[i-1].mingci;
else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}
void SelectSort( Student &ST ) //选择排序
{
int i, j, k;
Stud temp;
for( i = 0; i < ST.length; i++ )
{
k = i;
for( j = i+1; j<ST.length; j++ )
if( ST.elem[k].score < ST.elem[j].score )
k = j;
if ( k != i )
{
temp = ST.elem[i];
ST.elem[i] = ST.elem[k];
ST.elem[k] = temp;
}
}
ST.elem[0].mingci = 1;
for( i=1; i < ST.length; i++ )
if( ST.elem[i].score == ST.elem[i-1].score )
ST.elem[i].mingci = ST.elem[i-1].mingci;
else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}
void QuickSort( Student &ST ) //非递归的快速
struct Stack{
int low;
int high;
}S[20];
int low1, high1, i, j, top;
Stud temp;
if( ST.length>0 )
{ top=0; S[top].low = 0; S[top++].high = ST.length-1;
while( top )
{ i = low1 = S[--top].low; j = high1 = S[top].high;
temp = ST.elem[i];
while( i < j )
{
while( i < j && ST.elem[j].score > temp.score ) j--; if( i < j )
{
ST.elem[i] = ST.elem[j] ; i++;
}
while( i < j && ST.elem[i].score < temp.score ) i++; if( i < j )
{ ST.elem[j] = ST.elem[i] ; j--;
}
}
ST.elem[i] = temp;
if( i-1 > low1 )
{
S[top].low = low1; S[top++].high = i-1;
}
if( j+1 < high1 )
{
S[top].low = j+1; S[top++].high = high1;
}
}//while ST.elem[0].mingci = 1; for( i=1; i < ST.length; i++ ) if( ST.elem[i].score == ST.elem[i-1].score ) ST.elem[i].mingci = ST.elem[i-1].mingci; else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}//if
}
//下面是2-归并排序
Student TR1; //设置全局变量TR1,完成合并后的赋值操作
void Merge( Student &SR, int i, int m, int n ) //将两个有序子表合并成一个有序子表 {
int j = m+1, k=i, temp = i;
while( i <= m && j <= n )
if( SR.elem[i].score > SR.elem[j].score ) TR1.elem[k++] = SR.elem[i++]; else TR1.elem[k++] = SR.elem[j++];
while( i <= m ) TR1.elem[k++] = SR.elem[i++];
while ( j <= n)
TR1.elem[k++] = SR.elem[j++];
for( k = temp; k <= n; k++ )
SR.elem[k] = TR1.elem[k];
}
void MSort( Student &SR, int m, int n )
{
int t;
if ( m < n )
{
t = ( m+n )/2;
MSort( SR, m, t );
MSort( SR, t+1, n );
Merge( SR, m, t, n );
}
}//Merge
void MergeSort( Student &ST )
{
int i;
MSort( ST, 0, ST.length-1 );
ST.elem[0].mingci = 1;
for( i=1; i < ST.length; i++ )
if( ST.elem[i].score == ST.elem[i-1].score )
ST.elem[i].mingci = ST.elem[i-1].mingci;
else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}
void HeapAdjust( Student &SR, int s, int n ) //将SR.elem[s..n]调整成一个大顶堆
{ Stud temp; int j; temp = SR.elem[s]; j = 2*s+1;
while( j <=n )
{
if( j < n && SR.elem[j].score < SR.elem[j+1].score ) j++;
if( temp.score > SR.elem[j].score ) break;
SR.elem[s] = SR.elem[j]; s = j; j = j*2+1;
}
SR.elem[s] = temp;
}
void HeapSort( Student &ST ) //堆排序
{ int i; Stud temp;
for( i = ( ST.length-1 )/2; i >= 0; i-- )
HeapAdjust( ST, i, ST.length-1 );
for ( i = ST.length-1; i > 0; i-- )
{
temp = ST.elem[0]; ST.elem[0] = ST.elem[i]; ST.elem[i] = temp; HeapAdjust( ST, 0, i-1 );
}
ST.elem[0].mingci = 1; for( i=1; i < ST.length; i++ )
if( ST.elem[i].score == ST.elem[i-1].score ) ST.elem[i].mingci = ST.elem[i-1].mingci; else ST.elem[i].mingci = ST.elem[i-1].mingci+1;
}
void main()
{ Student ST; int select;
printf( “建立学生基本情况信息表\n\n” );
CreateTable( ST );
printf( “\n输出未排序的学生信息\n” );
Output( ST );
printf( “ 请选择排序方法\n” ); printf( “ ******************************\n” );
printf( “ 1.插入排序\n ” );
printf( “ 2.冒泡排序\n ” );
printf( “ 3.选择排序\n ” );
printf( “ 4.快速排序\n ” );
printf( “ 5.归并排序\n ” );
printf( “ 6.堆排序\n ” ); printf( “ ******************************\n” );
printf( “ 请选择(1——6):” );
scanf( “%d”, &select );
if( select == 1 )
InsertSort( ST );
else if( select == 2 )
BubbleSort( ST );
else if( select == 3 )
SelectSort( ST );
else if( select == 4 )
QuickSort( ST );
else if( select == 5 )
{
TR1 = (Stud*)malloc(MAX_TABLE*sizeof(Stud));
TR1.length = ST.length; MergeSort( ST );
}
else if( select == 6 )
HeapSort( ST );
else { printf( “\n选择编号错误\n” );
exit(0);
}
printf( “\n输出排序后的学生信息\n” );
Output( ST );
}