《软件技术基础》实验指导 实验七
排序
实验七 排序
一、实验目的
- 熟悉各种内部排序算法
- 能够编写程序显示排序过程中各趟排序的结果
- 能够编写一些排序的算法
二、实验内容
- 采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。
- 编写一个双向起泡的排序算法,即在排序过程中交替改变扫描方向,同时显示各趟排序的结果。
Tips
- 7.1 希尔排序 https://en.wikipedia.org/wiki/Shellsort
- 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++;
}
}