1、1.1 题目分析比较冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序等排序算法的运行速度,通过设计的程序显示各排序算法的比较次数与交换次数从而进一步分析各排序算法的优劣。;1.2 数据结构排序算法的比较问题中涉及的数据结构包括对冒泡函数,插入函数,选择函数,快速排序函数,希尔排序函数的定义与使用。1.3 流程图排序算法的比较流程如图1所示:图1排序算法的比较流程图1.4 实现技术为实现上述设计,采用C+语言,VS2008开发环境。具体采用的技术如下:(1)对函数的定义与调用(2)各函数运行的内部比较实现步骤如下:(1)用随机数生成器输入你所需要的数组内数的个数。(2)分别定义冒泡排序,
2、插入排序,选择排序,快速排序,希尔排序函数。(3)分别调用各个排序函数,将随机数生成器生成的数组导入各函数。(4)运行程序,显示各函数的比较次数与交换次数,从而进行比较。运行结果如下:注意:此处应采用软件截图说明!输入元素个数为20输入元素个数为1001.5 设计结论和心得通过课程设计得到如下结论:(1)快速排序与希尔排序的比较次数与交换次数较其他的要少。(2)冒泡排序较其他排序相对比较麻烦。(3)对于一般的排序,比较次数多,而交换次数相对较少;而快速排序比较次数和交换次数都较少,两者相差不如前者大。其中冒泡排序比较和交换次数都很大。有如下几点心得体会:(1)实验中的存在问题和提高,存在问题:
3、程序有待增强。提高:界面处理简洁。(2)收获与体会各种排序的算法,排序的算法的比较次数与移动次数的计算,随机数的生成2 Linux代码分析为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:#include iostreamusing namespace std;#define LS(a,b) (a)#define MAXSIZE 10000typedef int KeyType;typedef struct KeyType key;RedType;RedType rMAXSIZE+1;int length;SqList;int compare=0;int
4、change=0;int Create_Sq(SqList &L) int k;coutk;L.length=k;srand(time(NULL); for (int x=1; x=k; x+) L.rx.key= rand() % k;/随机域为0k return 1;void Bubble_sort(SqList &L)/冒泡排序int i,j,l,k=L.length,m=0,n=0;for(i=1;i=L.length-1;+i) for(j=1;j=k-1;+j) +m; if(LL(L.rj.key,L.rj+1.key) l=L.rj.key; L.rj.key=L.rj+1.k
5、ey; L.rj+1.key=l; +n; -k;endl-冒泡排序后的序列-endl;=L.length;i+) cout L.ri.key;冒泡排序的比较次数:m冒泡排序的交换次数:n void InsertSort(SqList &L)/插入排序int i,j,m=0,n=0; for(i=2;+i) if(LS(L.ri.key,L.ri-1.key) L.r0=L.ri; L.ri=L.ri-1; for(j=i-2;LS(L.r0.key,L.rj.key);-j) L.rj+1=L.rj; L.rj+1=L.r0;-直接插入排序后的序列-直接插入排序的比较次数:直接插入排序的交换
6、次数: void SelectSort(SqList &L) /简单选择排序int l,i,j,m=0,n=0;L.length; j=i+1; l=i; for(j; if(LL(L.r0.key,L.rj.key) l=j; L.r0=L.rj; if(l!=i) L.rl=L.ri; L.ri=L.r0;-简单选择排序后的序列-简单选择排序的比较次数:简单选择排序的交换次数:int Partition(SqList &L,int low,int high)int pivotkey;L.r0=L.rlow;pivotkey=L.rlow.key;while(lowhigh) while(l
7、ow=pivotkey) +compare; -high; +change; L.rlow=L.rhigh;L.rlow.key +low; L.rhigh=L.rlow;L.rlow=L.r0;return low;void QSort(SqList &L,int low,int high)/递归形式的快速排序算法int pivotloc;if(low pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high);void QuickSort(SqList &L)int i;QSort(L,
8、1,L.length);-快速排序后的序列为-快速排序的比较次数:compare快速排序的交换次数:change0&j-=dk) L.rj+dk=L.rj; L.rj+dk=L.r0; void ShellSort(SqList &L,int dlta)/希尔排序int k,j=L.length/2,t=0;while(j=0) +t; j-=2;j=L.length/2;for(k=0;kt;+k)/计算每次的增量值 if(j=0) j=1;/定义最后一趟排序的增量 dltak=j;+k) ShellInsert(L,dltak);-希尔排序后的序列为-for(k=1;k+)L.rk.key
9、;希尔排序的比较次数:希尔排序的交换次数:/*这里是改造后的main,他的原始形式是dev自动生成的*/ int main(int argc, char *argv)int dltaMAXSIZE;SqList L,a,b,c,d;Create_Sq(L);a=b=c=d=L;Bubble_sort(L);InsertSort(a);SelectSort(b);QuickSort(c);ShellSort(d,dlta); system(PAUSE); return EXIT_SUCCESS;功能说明这一段程序的主要功能为:(1)显示同一数组用不同的排序方法的比较次数与交换次数。(2)比较各排
10、序算法的优劣。2.1 局部数据结构局部变量及数据结构,其类型定义及语义如下:1. 数据定义2. 函数如下,代码详见文件“排序比较.cpp”L)void InsertSort(SqList &void SelectSort(SqList &L,int low,int high)void ShellInsert(SqList &void ShellSort(SqList &L,int dlta )2.2 流程图本程序的流程图如图2所示图2程序流程图2.3 以实例说明运行过程理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示:影响排序的因素: 待排序的记录数目n 的大小。 记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小。 关键字的结构及其分布情况。 对排序稳定性的要求
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1