一、实验目的
1.熟悉并掌握各种排序方法的设计思路。
2.掌握各种具体排序算法在计算机上的实现。
3.掌握各种排序方法的性能比较。
二、实验内容
1.直接插入排序、冒泡排序和简单选择排序算法实现,分析各种方法进行排序时对关键字的比较次数和移动次数。
2.快速排序算法的实现。
三、实验要求
1.直接插入排序、冒泡排序和简单选择排序算法实现。(1)设哈希表长为20,用除留余数法构造一个哈希函数。
(1)输入同样一组整型数据,作为待排序记录的关键字序列。
(2)实现直接插入排序算法,输出排序后结果。
(3)实现冒泡插入排序算法,输出排序后结果。
(4)实现简单选择排序算法,输出排序后结果。
2.快速排序算法的实现。
(1)输入一组整型数据,作为待排序记录的关键字序列。
(2)实现快速排序算法,输出排序后结果。
四、详细程序清单
//排序
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define INFINITY 0x7FFFFFFF //定义最大值∞
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}SqList;
void InsertSort(SqList &L)//直接插入排序
{
int i,j;
for(i=2;i<=L.length;i++)
if(L.r[i].key<L.r[i-1].key)
{
L.r[0]=L.r[i];
L.r[i]=L.r[i-1];
for(j=i-2;L.r[0].key<L.r[j].key;j--)
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
}
}
void BubbleSort(SqList &L)//冒泡插入排序
{
int i,j,temp;
for(i=1;i<=L.length;i++)
for(j=1;j<=L.length-i;j++)
{
if(L.r[j].key>L.r[j].key)
{
temp=L.r[j].key;
L.r[j].key=L.r[j].key;
L.r[j].key=temp;
}
}
}
int SelectMinKey(SqList L,int i)//选择最小值
{
int min=INFINITY;
for(i;i<=L.length;i++)
{
if(L.r[i].key<INFINITY)
min=L.r[i].key;
}
return min;
}
void BSelectSort(SqList &L)//简单选择排序
{
int i,j,temp;
for(i=1;i<=L.length;i++)
{
j=SelectMinKey(L,i);
if(i!=j)
{
temp=L.r[j].key;
L.r[j].key=L.r[j].key;
L.r[j].key=temp;
}
}
}
int Partition(SqList &L,int low,int high)//快速排序
{
int pivotkey;
L.r[0]=L.r[low];
pivotkey=L.r[low].key;
while(low<high)
{
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QSort(SqList &L,int low,int high)//快速排序
{
int pivotloc;
if(low<high)
{
pivotloc=Partition(L,low,high);
QSort(L,low,pivotloc-1);
QSort(L,pivotloc+1,high);
}
}
void QuickSort(SqList &L)
{
QSort(L,1,L.length);
}
void Show(SqList L)//显示
{
for(int i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
}
int main()
{
SqList L;
printf("输入长度:");
scanf("%d",&L.length);
printf("输入元素:");
for(int i=1;i<=L.length;i++)
scanf("%d",&L.r[i].key);
InsertSort(L);
printf("直接插入排序结果:");
Show(L);
BubbleSort(L);
printf("\n冒泡插入排序结果:");
Show(L);
BSelectSort(L);
printf("\n简单插入排序结果:");
Show(L);
QuickSort(L);
printf("\n快速排序结果: ");
Show(L);
}
五、程序运行结果
六、实验心得体会
1.本次作业总共使用了四种排序方法,使我更加深刻地认识到了四中不同排序算法的差别和优劣。
2.快速排序虽然难以理解,却是效率最高的排序算法,须牢牢掌握。
3.这是最后一次写实验报告了,回首这一学期,感触良多。我本来就很喜欢编程,也打ACM,但是刚开始接触《数据结构》这本书的时候还是觉得晦涩难懂,不过随着逐渐的学习,越来越能感受到这本书的美妙。一学期的锻炼让我梳理清楚了数据的结构,对原来不常用的算法进行了查漏补缺,尤其是编程风格得到了很大提高。但我还有很多很多不足:书上有些代码的写法我依然不能很好的理解;我经常为了省事滥用全局变量;函数的嵌套有时复杂繁乱;代码风格不统一:大小写用法不统一,变量名、函数名不统一,有时候觉得这样写好,有时又觉得那样写好。
4.学习编程的道路还很长很长,以后会更加努力!