排序及其应用

数据结构(实验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);
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chj65

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值