内部排序比较
- 格式:docx
- 大小:142.73 KB
- 文档页数:18
哈尔滨理工大学课程设计(数据结构)题目:内部排序算法比较班级:姓名:指导教师:系主任:2013年3月7号目录1.(内部排序算法)问题课程设计————3 1.1题目分析—————————————3 1.2数据结构—————————————3 1.3流程图——————————————4 1.4实现技术—————————————51.5设计结论和心得——————————62. (C++)代码分析——————————7 2.1功能说明—————————————13 2.2局部数据结构———————————13 2.3流程图——————————————141内部排序课程设计1.1题目分析对各种内部排序算法的时间复杂度有一个比较直观的感受,包括关键字比较次数和关键字移动次数。
将排序算法进行合编在一起,可考虑用顺序执行各种排序算法来执行,最后输出所有结果。
1.2数据结构本程序中,考虑的内容就是待排序对象,排序的依据是关键字之间的大小比较,故在每个节点的类型定义中,至少得包含关键字key一项。
不失一般性,这里就使用关键词这一项,其他都省略,具体应用加上其他数据项即可。
被排序对象是由一个个节点够成,一个排序对象包含一系列指向一串节点的指针,排序对象的长度。
本程序功能简单。
typedef struct{int key; /*关键字*/}RecordNode; /*排序节点的类型*/typedef struct{RecordNode *record;int n; /*排序对象的大小*/}SortObject; /*排序节点的类型*/用伪代码表示如下1)冒泡排序算法伪代码bubblesoft(data[ ]){ for i=1to data.length-2 for j=data.length-1 downto j+1如果顺序错误就交换j和j-1的位置上元素;}2)选择排序算法伪代码selectionsoft(data[ ]){ for i=1to data.length-2从data[i],……,data[data.length-1]中选取最小的元素将它和data[i]交换;}3)插入排序算法伪代码insertionsoft(data[ ]){ for i=1todata.length-1 tmp =data[i];将所有大于tmp的元素data[j]移动一个位置;把tmp放到正确的位置上;}为了实现这些数据结构,用C语言定义变量如下:int Create_Sq(SqList &L)void Bubble_sort(SqList &L)//冒泡排序void InsertSort(SqList &L)//插入排序void SelectSort(SqList &L) //简单选择排序int Partition(SqList &L,int low,int high)void QSort(SqList &L,int low,int high)//递归形式的快速排序算法void QuickSort(SqList &L)void ShellInsert(SqList &L,int dk)//希尔排序void ShellSort(SqList &L,int dlta[ ]1.3流程图1.4实现技术实现步骤如下:1.待排序长度不小于100,数据可有随机函数产生,用五组不同输入数据做比较,比较的指标为关键字参加比较的次数和关键字移动的次数;2.对结果做简单的分析,包括各组数据得出结果的解释;3.设计程序用顺序存储。
运行结果如下:元素个数为20元素个数为1001.5设计结论和心得(1)实验中的存在问题和提高存在问题:程序有待增强。
提高:界面处理简洁。
(2)收获与体会各种排序的算法排序的算法的比较次数与移动次数的计算随机数的生成2.代码分析为了进一步了解操作系统内核,学习了Linux操作系统的进程同步程序,主要程序源代码如下:#include <cstdlib>#include <iostream>using namespace std;#define LS(a,b) ((a)<(b))#define LL(a,b) ((a)>(b))#define MAXSIZE 10000typedef int KeyType;typedef struct {KeyType key;}RedType;typedef struct {RedType r[MAXSIZE+1];int length;}SqList;int compare=0;int change=0;int Create_Sq(SqList &L){int k;cout<<"20074795元素个数:";cin>>k;L.length=k;srand(time(NULL));for (int x=1; x<=k; x++){L.r[x].key= rand() % k;//随机域为0~k }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.r[j].key,L.r[j+1].key)){l=L.r[j].key;L.r[j].key=L.r[j+1].key;L.r[j+1].key=l;++n;}}--k;}cout<<endl<<"-----冒泡排序后的序列-----"<<endl; for(i=1;i<=L.length;i++)cout<<""<<L.r[i].key;cout<<endl;cout<<"冒泡排序的比较次数:";cout<<m<<endl;cout<<"冒泡排序的交换次数:";cout<<n<<endl;}void InsertSort(SqList &L)//插入排序{int i,j,m=0,n=0;cout<<endl;for(i=2;i<=L.length;++i)if(LS(L.r[i].key,L.r[i-1].key)){++m;++n;L.r[0]=L.r[i];L.r[i]=L.r[i-1];for(j=i-2;LS(L.r[0].key,L.r[j].key);--j){++m;L.r[j+1]=L.r[j];}L.r[j+1]=L.r[0];}cout<<"-----直接插入排序后的序列-----"<<endl; for(i=1;i<=L.length;i++)cout<<""<<L.r[i].key;cout<<endl;cout<<"直接插入排序的比较次数:";cout<<m<<endl;cout<<"直接插入排序的交换次数:";cout<<n<<endl;}void SelectSort(SqList &L) //简单选择排序{int l,i,j,m=0,n=0;cout<<endl;for(i=1;i<L.length;++i){L.r[0]=L.r[i];j=i+1;l=i;for(j;j<=L.length;++j){++m;if(LL(L.r[0].key,L.r[j].key)){l=j;L.r[0]=L.r[j];}}if(l!=i){++n;L.r[l]=L.r[i];L.r[i]=L.r[0];}}cout<<"-----简单选择排序后的序列-----"<<endl; for(i=1;i<=L.length;i++)cout<<""<<L.r[i].key;cout<<endl;cout<<"简单选择排序的比较次数:";cout<<m<<endl;cout<<"简单选择排序的交换次数:";cout<<n<<endl;}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){++compare;--high;}++change;L.r[low]=L.r[high];while(low<high&&L.r[low].key<=pivotkey){++compare;++low;}++change;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){int i;QSort(L,1,L.length);cout<<"-----快速排序后的序列为-----"<<endl;for(i=1;i<=L.length;i++)cout<<""<<L.r[i].key;cout<<endl;cout<<"快速排序的比较次数:";cout<<compare<<endl;cout<<"快速排序的交换次数:";cout<<change<<endl;compare=0;change=0;}void ShellInsert(SqList &L,int dk)//希尔排序{int i;int j;for(i=dk+1;i<=L.length;++i)if(LS(L.r[i].key,L.r[i-dk].key)){++compare;L.r[0]=L.r[i];for(j=i-dk;j>0&&LS(L.r[0].key,L.r[j].key);j-=dk){ ++compare;++change;L.r[j+dk]=L.r[j];}L.r[j+dk]=L.r[0];}}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;k<t;++k)//计算每次的增量值{if(j==0)j=1;//定义最后一趟排序的增量dlta[k]=j;j-=2;}for(k=0;k<t;++k)ShellInsert(L,dlta[k]);cout<<"-----希尔排序后的序列为-----"<<endl; for(k=1;k<=L.length;k++)cout<<""<<L.r[k].key;cout<<endl;cout<<"希尔排序的比较次数:";cout<<compare<<endl;cout<<"希尔排序的交换次数:";cout<<change<<endl;compare=0;change=0;}/*这里是改造后的main,他的原始形式是dev自动生成的*/int main(int argc, char *argv[]){int i;int dlta[MAXSIZE];SqList L,a,b,c,d;Create_Sq(L);a=b=c=d=L;for(i=1;i<=L.length;i++)cout<<""<<L.r[i].key;Bubble_sort(L);InsertSort(a);SelectSort(b);QuickSort(c);ShellSort(d,dlta);/*这两行是系统自动生成的main中的内容,不要删了*/system("PAUSE");return EXIT_SUCCESS;}2.1功能说明这一段程序的主要功能为:时间复杂度与空间复杂度:理论分析可以得出各种排序算法的时间复杂度和空间复杂度,如下表所示(图6):影响排序的因素:◆待排序的记录数目n 的大小。