JLU
数据结构课程设计报告
——内部排序算法比较
《数据结构》课程设计报告
姓名
提交日期
学号
成绩
实验室
座位号
组号
指导教师
问题解析(对问题的分析、解题思路与解题方法):
利用随机函数产生 N(N>1000)个随机整数,利用起泡排序,直接插入排序,简单选
择排序,快速排序,希尔排序,堆排序 6 种排序方法进行排序,比较的指标为关键字的比较
次数和关键字的移动次数,以取得直观感受,多次试验,同时统计在完全正序、完全逆序情
况下的关键字比较次数和移动次数,与无序情况进行对比。
解题方法为编写函数,实现:
1)分配内存空间。创建顺序表
2)利用自己编写的函数和伪随机数产生程序产生随机数,作为程序运行的数据
3)实现每种排序算法的功能函数
任务分工及进度安排:
主程序模块
随机数产生模块
排序算法模块
数据结构选择(包括改进或给出)、算法设计:
本程序采用顺序表结构,具体结构定义如下:
typedef struct
{
int key;
}ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;
编程与程序清单:
头文件和全局变量定义:
#include"iostream"
#include
#include
#include"string.h"
#include"time.h"
using namespace std;
#define LIST_INIT_SIZE 50000
Long
long
int
bj1=0,yd1=0,bj2=0,yd2=0,bj3=0,yd3=0,bj4=0,yd4=0,bj5=0,yd5=0,bj6=0,yd6=0,n=0;
//bj,yd 为记录关键字比较和移动的次数
系统共设置16个函数,其中包括主函数。各函数名及功能说明如下。
1) void addlist(SqList &L)
2) void random(SqList &L)
//建立个空顺序表
//随机数产生函数
3) void memory(SqList &M,SqList &L)
//记录L,以保证每个排序函数使用一组随机数
4) void BubbleSort(SqList &L)
//冒泡排序
5) void InsertSort(SqList &L)
//直接插入排序
6) void SelectSort(SqList &L)
//选择排序
7) int Partition(SqList &L,int low,int high) //返回快速排序枢轴的位置
8) void
QSort(SqList &L,int low,int high) //对子序列作快速排序
9) void QuickSort(SqList &L)
//对数序表作快速排序
10)void ShellSort (SqList &L)
//希尔排序
11)void HeapAdjust(SqList &L,int s,int m )//堆排序算法子程序
12)void HeapSort(SqList &L)
//对顺序表进行堆排序
13)void main()
//主函数,调用各模块函数
14)void reversed(SqList &L)
15)void order(SqList &L)
16) void compare()
//逆序数产生程序
//顺序数产生程序
//输出函数
测试方法、测试数据与测试结果:
运行程序后,得到如图所示:
程序的使用说明:
(1)采用伪随机数程序产生随机数作为排序的数据。
(2)用户只需按提示选择程序功能,并输入随机数个数即可得到结果
总结:
(对程序进行分析、评价运行效果,总结遇到的问题及解决办法)
结果分析:冒泡排序,直接插入排序以及简单选择排序比较次数较多,快速排序,希
尔排序及堆排序比较次数较少;并可得冒泡排序和直接插入排序相对较稳定,其他四种内
部排序为不稳定排序。
在程序产生数为顺序数时,冒泡排序,直接插入排序,简单选择,希尔排序的的性能
最好,不需要数据交换,简单选择排序的比较次数最多。
在程序产生数为逆序数时,快速排序和堆排序的性能最好,比较次数和交换次数要少
很多。
总体来说,在产生数据量越来越大的的时候,快速排序,希尔排序及堆排序的性能要
远好于其他几种。
总体运行良好。
出现的问题:
开始的时候当多次运行时出现了堆栈溢出的问题,程序会自动关闭,最终找到在 vs2010
中修改堆栈的默认大小的方法,选择 项目->属性->链接器->系统->堆栈保留大小,然后输入
你想要的栈大小即可。成功解决问题。
注:各部分内容要求填写详尽,如空间不够可自行扩充。
附件:
程序详细代码:
// test1.cpp : 定义控制台应用程序的入口点。
//
#include "StdAfx.h"
#include"iostream"
#include
#include
#include"string.h"
#include"time.h"
using namespace std;
#define LIST_INIT_SIZE 50000
long long int bj1=0,yd1=0,bj2=0,yd2=0,bj3=0,yd3=0,bj4=0,yd4=0,bj5=0,yd5=0,bj6=0,yd6=0,n;//yd,bj 为记录关键字比较和移动的次
数
typedef struct
{
int key;
}ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;
void addlist(SqList &L)//初始化顺序表
{
a: printf("请输入你要输入的个数:");
cin>>n;
if(n>50000)
printf("超出范围重新输入!!!\n");
goto a;
{
}
}
void order(SqList &L)//顺序数产生程序
{ L.length=0;
for(int i=1;ivoid
reversed(SqList &L)//逆序数产生程序
{ L.length=0;
for(int i=1;i
30000)
goto a;
++L.length;
}
}
void memory(SqList &M,SqList &L)//记录 L,使每个排序算法都用一组相同的随机数
{
}
M.length=0;
for(int i=1;ibj1++;
if(L.elem[i].key>L.elem[i+1].key)
{e=L.elem[i].key;
L.elem[i].key=L.elem[i+1].key;
L.elem[i+1].key=e;
yd1+=3;
t=i;}
}
bound=t;
}
}void InsertSort(SqList &L)//直接插入排序
{
int i,j;
for(i=2;i<=L.length;i++)
{ bj2++;
if(L.elem[i].key