数据结构(实验C语言版)
排序及其应用
一、实验目的
(1)掌握在数组上进行各种排序的方法和算法
(2)深刻理解各种方法的特点,并能灵活运用
二、实验环境
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
VS2010或Visual C++ 6.0或Win-TC等。
三、实验内容
设计一个程序,针对关键字序列T={9,8,7,6,5,4,3,2,1,0},分别利用直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序算法实现排序。
四、实验要求
1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。
2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。
源代码
代码:
#include <stdio.h>
#define MAXE 20 //线性表中最多元素个数
typedef int KeyType;
typedef char InfoType[10];
typedef struct //记录类型
{
KeyType key; //关键字项
InfoType data; //其他数据项,类型为InfoType
} RecType;
void InsertSort(RecType R[], int n) //对R[0..n-1]按递增有序进行直接插入排序
{
int i, j, k;
RecType temp;
for (i = 1; i<n; i++)
{
temp = R[i];
j = i - 1; //从右向左在有序区R[0..i-1]中找R[i]的插入位置
while (j >= 0 && temp.key<R[j].key)
{
R[j + 1] = R[j]; //将关键字大于R[i].key的记录后移
j--;
}
R[j + 1] = temp; //在j+1处插入R[i]
printf("i=%d,", i); //输出每一趟的排序结果
printf("插入%d,结果为: ", temp);
for (k = 0; k<n; k++)
printf("%3d", R[k].key);
printf("\n");
}
}
void ShellSort(RecType R[], int n) //希尔排序算法
{
int i, j, d, k;
RecType temp;
d = n / 2; //d取初值n/2
while (d>0)
{
for (i = d; i<n; i++) //将R[d..n-1]分别插入各组当前有序区中
{
j = i - d;
while (j >= 0 && R[j].key>R[j + d].key)
{
temp = R[j]; //R[j]与R[j+d]交换
R[j] = R[j + d];
R[j + d] = temp;
j = j - d;
}
}
printf("d=%d: ", d); //输出每一趟的排序结果
for (k = 0; k<n; k++)
printf("%3d", R[k].key);
printf("\n");
d = d / 2; //递减增量d
}
}
void BubbleSort(RecType R[], int n) //冒泡排序算法
{
int i, j, k;
RecType temp;
for (i = 0; i<n - 1; i++)
{
for (j = n - 1; j>i; j--) //比较,找出本趟最小关键字的记录
if (R[j].key<R[j - 1].key)
{
temp = R[j]; //R[j]与R[j-1]进行交换,将最小关键字记录前移
R[j] = R[j - 1];
R[j - 1] = temp;
}
printf("i=%d,冒出的最小关键字:%d,结果为: ", i, R[i].key); //输出每一趟的排序结果
for (k = 0; k<n; k++)
printf("%2d", R[k].key);
printf("\n");
}
}
int n;
void QuickSort(RecType R[], int s, int t) //对R[s]至R[t]的元素进行快速排序
{
int i = s, j = t, k;
RecType temp;
if (s<t) //区间内至少存在一个元素的情况
{
temp = R[s]; //用区间的第1个记录作为基准
while (i != j) //从区间两端交替向中间扫描,直至i=j为止
{
while (j>i && R[j].key>temp.key)
j--; //从右向左扫描,找第1个关键字小于temp.key的R[j]
R[i] = R[j];
while (i<j && R[i].key<temp.key)
i++; //从左向右扫描,找第1个关键字大于temp.key的记录R[i]
R[j] = R[i];
}
R[i] = temp;
printf(" 划分区间为R[%d..%d],结果为:", s, t); //输出每一趟的排序结果
for (k = 0; k<10; k++)
if (k == i)
printf(" [%d]", R[k].key);
else
printf("%4d", R[k].key);
printf("\n");
QuickSort(R, s, i - 1); //对左区间递归排序
QuickSort(R, i + 1, t); //对右区间递归排序
}
}
void SelectSort(RecType R[], int n) //直接选择排序算法
{
int i, j, k, l;
RecType temp;
for (i = 0; i<n - 1; i++) //做第i趟排序
{
k = i;
for (j = i + 1; j<n; j++) //在当前无序区R[i..n-1]中选key最小的R[k]
if (R[j].key<R[k].key)
k = j; //k记下目前找到的最小关键字所在的位置
if (k != i) //交换R[i]和R[k]
{
temp = R[i]; R[i] = R[k]; R[k] = temp;
}
printf(" i=%d,选择的关键字:%d,结果为:", i, R[i].key);
for (l = 0; l<n; l++) //输出每一趟的排序结果
printf("%2d", R[l].key);
printf("\n");
}
}
void main()
{
int i, k, n = 10;
KeyType a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
RecType R[MAXE];
for (i = 0; i<n; i++)
R[i].key = a[i];
printf("初始关键字: "); //输出初始关键字序列
for (k = 0; k<n; k++)
printf("%3d", R[k].key);
printf("\n");
InsertSort(R, n);
printf("直接插入排序之后关键字序列为: "); //输出直接插入排序之的关键字序列
for (k = 0; k<n; k++)
printf("%3d", R[k].key);
printf("\n\n");
for (i = 0; i<n; i++)
R[i].key = a[i];
printf("希尔排序过程如下:\n");
ShellSort(R, n);
printf("最后结果: "); //输出希尔排序之后关键字序列
for (k = 0; k<n; k++)
printf("%3d", R[k].key);
printf("\n\n");
for (i = 0; i<n; i++)
R[i].key = a[i];
printf("冒泡排序过程如下:\n");
BubbleSort(R, n);
printf("最后结果: "); //输出冒泡排序之后关键字序列
for (k = 0; k<n; k++)
printf("%2d", R[k].key);
printf("\n\n");
for (i = 0; i<n; i++)
R[i].key = a[i];
printf("快速排序过程如下:\n");
QuickSort(R, 0, n - 1);
printf("最后结果: "); //输出快速排序之后关键字序列
for (k = 0; k<n; k++)
printf("%4d", R[k].key);
printf("\n\n");
for (i = 0; i<n; i++)
R[i].key = a[i];
printf("直接选择排序过程如下:\n");
SelectSort(R, n);
printf("最后结果:"); //输出直接选择排序之后关键字序列
for (k = 0; k<n; k++)
printf("%2d", R[k].key);
}