数据结构课程设计报告几种排序算法的演示附源代码Word格式.docx
《数据结构课程设计报告几种排序算法的演示附源代码Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告几种排序算法的演示附源代码Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
算法设计思想
交换排序(冒泡排序、快速排序)
交换排序的基本思想是:
对排序表中的数据元素按关键字进行两两比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。
插入排序(直接插入排序、折半插入排序)
插入排序的基本思想是:
每一次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。
开始时建立一个初始的有序序列,它只包含一个数据元素。
然后,从这个初始序列出发不断插入数据元素,直到最后一个数据元素插到有序序列后,整个排序工作就完成了。
选择排序(简单选择排序、堆排序)
选择排序的基本思想是:
第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟(例如第i趟,i=1,…,n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素,作为有序数据元素序列的第i个数据元素。
等到第n-1趟选择结束,待排序数据元素仅剩下一个时就不用再选了,按选出的先后次序所得到的数据元素序列即为有序序列,排序即告完成。
4>
归并排序(两路归并排序)
两路归并排序的基本思想是:
假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项),先做两两归并,得n/2上取整个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);
再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。
程序的主要流程图
程序的主要模块(要求对主要流程图中出现的模块进行说明)
程序的主要模块主要分为主菜单模块和排序算法演示模块。
主菜单
主要功能:
程序运行时,可使运行者根据提醒输入相关操作,从而进入不同的排序方法或者退出。
排序方法及输出
根据运行者对排序的不同选择,进入排序过程
a.直接插入排序:
根据直接排序的算法,输出排序过程
b.折半插入排序:
根据折半插入的算法,输出排序过程
c.冒泡排序:
根据冒泡排序算法,输出排序过程
d.简单选择排序:
根据简单选择排序的算法,输出排序过程
e.快速排序:
根据快速排序的算法,输出排序过程
f.堆排序:
根据堆排序的算法,输出排序过程
g.归并排序:
根据归并排序的算法,输出排序过程
程序的主要函数及其伪代码说明
模板类
主要说明程序中用到的类的定义
template<
classtype>
classsortlist
{
private:
intcurrentsize;
//数据表中数据元素的个数
public:
type*arr;
//存储数据元素的向量(排序表)
sortlist():
currentsize(0){arr=newtype[maxsize];
}//构造函数
sortlist(intn){arr=newtype[maxsize];
currentsize=n;
}
voidinsert(inti,typex){arr[i]=x;
~sortlist(){delete[]arr;
}//析构函数
voidswap(type&
x,type&
y)//数据元素x和y交换位置
{typetemp=x;
x=y;
y=temp;
voidbubblesort();
//冒泡排序
voidquicksort(intlow,inthigh);
//快速排序
voidinsertionsort();
//直接插入排序
voidbinaryinsertsort();
//折半插入排序
voidselectsort();
//简单选择排序
voidheapsort();
//堆排序
voidmergesort(sortlist<
type>
&
table);
//归并排序
voidfilterdown(constintstart);
//建立最大堆
voidmergepass(sortlist<
&
sourcetable,sortlist<
mergedtable,constintlen);
//一趟归并
voidmerge(sortlist<
mergedtable,constintleft,constintmid,constintright);
//两路归并算法
};
直接插入排序
直接插入排序的基本思想:
开始时把第一个数据元素作为初始的有序序列,然后从第二个数据元素开始依次把数据元素按关键字大小插入到已排序的部分排序表的适当位置。
当插入第i(1<
i<
=n)个数据元素时,前面的i-1个数据元素已经排好序,这时,用第i个数据元素的关键字与前面的i-1个数据元素的关键字顺序进行比较,找到插入位置后就将第i个数据元素插入。
如此进行n-1次插入,就完成了排序。
以下是在顺序表上实现的直接插入排序
在顺序表上进行直接插入排序时,当插入第i(1<
=n)个数据元素时,前面的arr[0]、arr[1]、…、arr[i-2]已经排好序,这时,用arr[i-1]的关键字依次与arr[i-2],arr[i-3],…的关键字顺序进行比较,如果这些数据元素的关键字大于arr[i-1]的关键字,则将数据元素向后移一个位置,当找到插入位置后就将arr[i-1]插入,就完成了arr[0],arr[1],…,arr[n-1]的排序。
伪代码如下
template<
voidsortlist<
:
insertionsort()
typetemp;
intj;
for(inti=1;
=currentsize-1;
i++)
{
temp=arr[i];
j=i-1;
while(j>
=0&
temp<
arr[j])
{arr[j+1]=arr[j];
j--;
arr[j+1]=temp;
cout<
"
第"
++num<
趟排序结果为:
;
for(intt=0;
t<
currentsize;
t++)
cout<
arr[t]<
"
endl;
}
num=0;
折半插入排序
折半插入排序的基本思想:
设在排序表中有n个数据元素arr[0],arr[1],…,arr[n-1]。
其中,arr[0],arr[1],…,arr[n-1]是已经排好序的部分数据元素序列,在插入arr[i]时,利用折半查找方法寻找arr[i]的插入位置。
折半插入排序方法只能在顺序表存储结构实现。
伪代码如下:
binaryinsertsort()
intleft,right;
{
left=0;
right=i-1;
temp=arr[i];
while(left<
=right)//找插入位置
{
intmid=(left+right)/2;
if(temp<
arr[mid])right=mid-1;
elseleft=mid+1;
}
for(intk=i-1;
k>
=left;
k--)//向后移动
arr[k+1]=arr[k];
arr[left]=temp;
for(intt=0;
cout<
<
冒泡排序
冒泡排序的基本思想是:
设排序表中有n个数据元素。
首先对排序表中第一,二个数据元素的关键字arr[0]和arr[1]进行比较。
如果前者大于后者,则进行交换;
然后对第二,三个数据做同样的处理;
重复此过程直到处理完最后两个相邻的数据元素。
我们称之为一趟冒泡,它将关键字最大的元素移到排序表的最后一个位置,其他数据元素一般也都向排序的最终位置移动。
然后进行第二趟排序,对排序表中前n-1个元素进行与上述同样的操作,其结果使整个排序表中关键字次大的数据元素被移到arr[n-2]的位置。
如此最多做n-1趟冒泡就能把所有数据元素排好序。
bubblesort()
inti=1;
intfinish=0;
//0表示还没有排好序
while(i<
currentsize&
!
finish)
finish=1;
//排序结束标志置为,假定已经排好序
for(intj=0;
j<
currentsize-i;
j++)
if(arr[j]>
arr[j+1])//逆序
{
swap(arr[j],arr[j+1]);
//相邻元素交换位置
finish=0;
}//排序结束标志置为,表示本趟发生了交换,说明还没有排好序
i++;
for(intt=0;
cout<
5>
简单选择排序(直接选择排序)
直接选择排序的算法基本思想是:
a)开始时设i的初始值为0。
b)如果i<
n-1,在数据元素序列arr[i]arr[n-1]中,选出具有最小关键字的数据元素arr[k];
否则算法结束。
c)若arr[k]不是这组数据元素中的第一个数据元素(i≠k),则将arr[k]与arr[i]这两数据元素的位置对调;
d)令i=i+1转步骤b)。
selectsort()//简单选择排序
intk;
for(inti=0;
k=i;
for(intj=i+1;
if(arr[j]<
arr[k])
k=j;
//k指示当前序列中最小者的位置
if(k!
=i)//最小关键字的数据元素位置不等于i
swap(arr[i],arr[k]);