《软件技术基础》实验指导 实验七

排序

实验七 排序

一、实验目的

  1. 熟悉各种内部排序算法
  2. 能够编写程序显示排序过程中各趟排序的结果
  3. 能够编写一些排序的算法

二、实验内容

  1. 采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。
  2. 编写一个双向起泡的排序算法,即在排序过程中交替改变扫描方向,同时显示各趟排序的结果。

Tips

  1. 7.1 希尔排序 https://en.wikipedia.org/wiki/Shellsort
  2. 7.2 鸡尾酒排序 https://en.wikipedia.org/wiki/Cocktail_shaker_sort

Answer

7.1

//希尔排序的程序代码
#include<stdio.h>
//顺序表结构类型定义
typedef int datatype;
typedef struct{
	int key;
	datatype data;
}rectype;
const int N=10;
const int D1=5;

void create(rectype[],int);
void print(rectype[],int);
void shellsort(rectype[],int[]);

//void main()
int main()
{
	rectype r[N+D1];//D1个元素存放监视哨,N个元素存放记录
	int d[3]={5,3,1};//设置3趟的增量
	create(r,N);//建立存放记录的顺序表
	printf("排序前的数据:");
	print(r,N);//输出排序前的记录表
	shellsort(r,d);//希尔排序
	printf("排序后的数据:");
	print(r,N);//输出排序后的记录表
	return 0;
}

//建立顺序表
void create(rectype r[],int n)
{
	printf("输入10个整型数:");
	for(int i=0;i<n;i++)
		scanf("%d",&r[D1+i].key);
}

//输出顺序表
void print(rectype r[],int n)
{
	for(int i=0;i<n;i++)
		printf("%5d",r[D1+i].key);
	printf("\n");
}

//希尔排序
void shellsort(rectype r[],int d[])
{
	int i,j,k,h;
	rectype temp;
	int maxint=32767;
	for(i=0;i<D1;i++)
	{
		r[i].key=-maxint;//设置 T 个监视哨
	}
	k=0;
	do
	{
		h=d[k];//取一趟的增量
		for(i=h+D1;i<N+D1;i++)
		{
			temp=r[i];
			j=i-h;
			while(temp.key<r[j].key)
			{
				r[j+h]=r[j];
				j=j-h;
			}
			r[j+h]=temp;
		}//组内直接插入法排序
		print(r,N);
		k++;
	}
	while(h!=1);
}

7.2

//双向起泡排序的程序代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//顺序表结构类型定义
typedef int datatype;
typedef struct{
	int key;
	datatype data;
}sequenlist;

void create(sequenlist[],int);
void print(sequenlist[],int);
void dbubblesort(sequenlist[],int);

//void main()
int main()
{
	const int n=10;
	sequenlist r[n+1];
	create(r,n);
	printf("排序前的数据:");
	print(r,n);
	dbubblesort(r,n);
	printf("排序后的数据:");
	print(r,n);
	return 0;
}

//建立顺序表
void create(sequenlist r[],int n)
{
	srand(time(0));
	for(int i=1;i<=n;i++)
		r[i].key=rand()%90;
}

//输出顺序表
void print(sequenlist r[],int n)
{
	for(int i=1;i<=n;i++)
		printf("%5d",r[i].key);
	printf("\n");
}

//双向起泡排序
void dbubblesort(sequenlist r[],int n)
{
	int i=1,j,noswap=1;
	sequenlist temp;
	while(noswap)
	{
		noswap=0;
		for(j=n-i+1;j>=i+1;j--)
		{
			if(r[j].key<r[j-1].key)
			{
				noswap=1;
				temp=r[j];
				r[j]=r[j-1];
				r[j-1]=temp;
			}
		}
		for(j=i+1;j<=n-i;j++)
		{
			if(r[j].key>r[j+1].key)
			{
				noswap=1;
				temp=r[j];
				r[j]=r[j+1];
				r[j=1]=temp;
			}
		}
		for(int k=1;k<=n;k++)
		{
			printf("%5d",r[k].key);
		}
		printf("\n");
		i++;
	}
}

posted @ 2017-12-25 21:05  VanLion  阅读(363)  评论(0编辑  收藏  举报