排序实验报告Word下载.docx
- 文档编号:20877040
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:29
- 大小:303.70KB
排序实验报告Word下载.docx
《排序实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《排序实验报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
每次在进行排序操作之前,都有复制操作。
数组类型是自定义类型Srec<
T>
,里面包含排序关键码key,因为是整数,便没有其他域。
1、Sort()
构造函数,我的程序中,系统随机产生100个整数便在构造函数中进行,随机产生整数是用0+(int)10000*rand()/(RAND_MAX+1)实现,表示产生0~10000之间的整数,并赋值给raw_data[N+1],同时复制给handle_data[N+1]进行初始化,但这两个数组中第一个存储空间作为中间量使用,数据存储是从第二个位置开始。
2、voidOutPut()
输出排序表,即将数组handle_data[N+1]输出。
3、voidInsertSort()
直接插入排序,它的基本思路是每一趟将一个待排序的数据,按其大小插入到已经排序的部分中适当的位置,直到全部插入完成;
具体做法为:
当插入第i(i>
1)个数据时,前面的r[1],r[2],…,r[i-1]已经排好序,这时,用r[i]的数据与r[i-1],r[i-2],…的数据顺序进行比较,找到插入位置,即将r[i]插入,原来位置上的对象依次向后移动。
4、voidHalfInertsort()
折半插入排序,由于插入排序的基本操作是在一个有序表中进行查找和插入,而查找这个操作可以用折半查找来实现,折半查找就是用所插入的数据和有序区间的重点的数据进行比较,若二者相等这查找成功,否则可以根据比较结果来确定下次的查找区间,即若插入的数据小于有序区间重点的数据,那么,下次查找区间就在中点位置的前半部分,否则就在后半部分,然后在心底查找区间中进行相同的操作,知道找到插入位置为止。
5、voidShellSort()
希尔排序,其算法思想是不断的把待排序的一组数据按区间分成若干小组,然后对同一组的数据进行操作,如待排序的表中有n个数据,首先取一个整数gap(gap<
n)作为间隔增量,将全部数据分为gap个子序列,所有距离为gap的数据放在同一个序列中,在每一个子序列中进行直接插入排序,然后缩小间隔增量gap,重复以上的子序列划分和排序工作,直到gap=1,将所有记录放在同一个序列中进行直接插入排序为止。
6、voidSelectSort()
直接选择排序,将整个数据序列划分为有序去和无序区,有序区为于左端,无序区位于右端,初始状态有序区为空,无序区含有待排序的n个数据,第一趟排序时从当前无序区中选出最小的数据,将他与r[1]交换,则有序区由空变为r[1],第二趟排序时,又从剩下的无序区中选出最小的数据与r[2]交换,。
。
经过n-1次操作后,整个表就有序了。
7、voidBubbleSort()
冒泡排序,设想被排序的数据组垂直,通过无序区中相邻关键字的比较,如果逆序,则交换它们的位置,使关键字最小的数据如气泡一样逐渐往上移动,直至移到合适位置。
8、voidQuickSort(intlow,inthigh)
快速排序,是由冒泡排序改进而得到的,是一种分区交换排序方法,基本思路是在待排序的n个数据中任取一个数据(通常取第一个数据)作为基准数据,把该数据放在最终位置后,表被这个数据分隔成两部分,所有数据比基准数据小的数据放置在前一部分,大的放置在后一部分,并把该数据放在这两个部分的中间,,这个过程为一趟快速排序,之后对所分的两部分进行同样的操作,直到每部分内只有一个数据为止。
9、voidHeapSort()
堆排序,这是一种树形选择排序,他的特点是在排序过程中,将r[1..n]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中的双亲结点与孩子结点之间的内在关系,在当前无序区选出关键字最大的数据,堆排序中利用了大根堆中堆顶数据最大这一特性,使的在当前无序区选出最大的数据变得简单,基本操作为,先将r[1..n]构造成初始堆,将当前无序区的堆顶数据r[1]和该去最后一个数据交换,然后将新的无序区调整为大根堆,这样,在n-1趟后,r[1..n]就变得有序了。
10、voidMergeSort(intlow=1,inthigh=N)
归并排序,就是利用归并的技术进行的一种排序方法,所谓归并,是将另个及两个以上的有序表合成一个新的有序表,其基本思想为,将一个具有n个待排序的数据表看成是n个长度为1的有序子表,然后进行两两归并,得到[n/2]个长度为2的有序子表,在进行两两归并,得到[n/4]个长度为4的有序子表,如此重复,直到得到一个长度为n的有序表为止。
11、voidRadixSort()
基数排序,即对数据的逐位进行比较排序,如先比较个位,在比较十位,百位。
最后将得到一个有序的数据表。
以上就是排序类的定义及说明。
在写类时,每写好一个函数便在cpp文件调试,有错时,便走查代码。
最后便定义菜单类,本次实验完成。
五、主要代码及运行结果
主要代码:
1、Sort类
#include<
iomanip.h>
time.h>
stdlib.h>
#include"
LinkQueue.h"
constintN=100;
constintKeySize=4;
constintradix=10;
template<
classT>
structSrec
{
Tkey;
};
classSort
private:
Srec<
raw_data[N+1];
//原始数据
handle_data[N+1];
//处理数据
public:
Sort();
//构造函数
~Sort(){}//析构函数
voidOutPut();
//输出排序表
voidInsertSort();
//直接插入排序
voidHalfInertsort();
//折半插入排序
voidShellSort();
//希尔排序
voidSelectSort();
//直接选择排序
voidBubbleSort();
//冒泡排序
intPartition(inti,intj);
//对handle_data[i...j]进行一次划分
voidQuickSort(intlow,inthigh);
//对handle_data[i...j]进行快速排序
voidHeapSort();
//堆排除
voidSift(intlow,intheigh);
//将handle_data[low...high]调整成为大根堆
voidBuildHeap();
//将初始文件handle_data[1...N]构造成为大根堆
voidMerge(intlow,intmid,inthigh);
//将有序表handle_data[low...mid]和handle_data[mid...high]归并成一个有序表
voidMergeSort(intlow=1,inthigh=N);
//对handle_data[low...high]进行二次归并排序
voidRadixSort();
//基数排序
voidDistribute(LinkQueue<
B[],intj);
//按关键字的第j个分量进行分配
voidCollect(LinkQueue<
B[]);
//收集
voidCopy()//复制数组并输出
{
for(inti=1;
i<
=N;
i++)
handle_data[i].key=raw_data[i].key;
//复制
cout<
<
"
处理前的数据:
\n"
;
OutPut();
endl;
}
Sort<
:
Sort()//构造函数
srand((unsigned)time(NULL));
for(inti=1;
{
raw_data[i].key=0+(int)10000*rand()/(RAND_MAX+1);
//产生0到10000之间的随机整数
}
OutPut();
cout<
以上为系统随机产生的100个(0到10000之间)的整数!
请在下面的“排序菜单”中选择你的处理选项!
}
voidSort<
OutPut()//输出
intk=0;
setw(6)<
handle_data[i].key;
k++;
if(k%10==0)
cout<
InsertSort()//直接插入排序
inti,j;
//,m
for(i=2;
i++)//依次插入handle_data[2]...handle_data[N]
if(handle_data[i].key<
handle_data[i-1].key)
handle_data[0]=handle_data[i];
//保存handle_data[i],并设置哨兵handle_data[0]
j=i-1;
//有序区是handle_data[1...i-1]
do//在有序表中查找handle_data[i]的合适位置
{
handle_data[j+1]=handle_data[j];
//记录后移
j--;
}while(handle_data[j].key>
handle_data[0].key);
handle_data[j+1]=handle_data[0];
//将handle_data[i]插入到j+1的位置
/*cout<
直接插入排序第"
趟结果:
for(m=1;
m<
m++)
handle_data[m].key;
if(m%10==0)
cout<
*/
HalfInertsort()//折半插入排序
inti,j,low,high,mid;
//共进行N-1趟折半插入
handle_data[0]=handle_data[i];
low=1;
high=i-1;
while(low<
=high)//在handle_data[low...high]中折半查找handle_data[i]的合适位置
mid=(low+high)/2;
//取中间位置
if(handle_data[0].key<
handle_data[mid].key)
high=mid-1;
//插入点在前班部分
else
low=mid+1;
//插入点在后半部分
for(j=i-1;
j>
=high+1;
j--)
handle_data[j+1]=handle_data[j];
handle_data[high+1]=handle_data[0];
//将handle_data[i]插入到high+1的位置
折半插入排序第"
趟的结果:
if(m%10==0)
ShellSort()//希尔排序
inti,j,gap;
//以间隔增量gap对所有记录进行希尔排序
for(gap=N/2;
gap>
=1;
gap=gap/2)
for(i=gap+1;
if(handle_data[i].key<
handle_data[i-gap].key)
handle_data[0]=handle_data[i];
//暂存被插入记录
j=i-gap;
while(j>
=0&
&
handle_data[0].key<
handle_data[j].key)//对一个相隔gap位置的记录组进行直接插入排序
{
handle_data[j+gap]=handle_data[j];
j=j-gap;
//记录后移gap个位置
}
handle_data[j+gap]=handle_data[0];
}
希尔排序增量为"
gap<
时的结果:
BubbleSort()//冒泡排序
inti,j,exchange;
//exchenge为交换标志变量
for(i=1;
N;
i++)//进行N-1趟排序
exchange=0;
//本趟开始时将标志变量置0
for(j=N-1;
=i;
j--)//自下而上扫描
if(handle_data[j+1].key<
handle_data[j].key)//需要交换
handle_data[0]=handle_data[j+1];
handle_data[j]=handle_data[0];
exchange=1;
//发生了交换,标志变量置1
冒泡排序第"
if(m%10==0)
if(!
exchange)
break;
//本趟结束时,若未发生交换,则提前结束
intSort<
Partition(inti,intj)//对handle_data[i...j]进行划分,并返回划分后的基准位置
handle_data[0]=handle_data[i];
//用区间中的第一个记录作为基准
while(i<
j)
while(i<
j&
handle_data[j].key>
handle_data[0].key)//从区间两端向中间扫描,直到i=j为止
j--;
if(i<
j)//若找到这样的记录handle_data[j]
handle_data[i++]=handle_data[j];
//则将handle_data[j]移到基准的左边,指数器i加1
handle_data[i].key<
=handle_data[0].key)
i++;
j)//若找到这样的记录handle_data[i]
handle_data[j--]=handle_data[i];
//则将handle_data[i]移到基准的右边,指数器j减1
handle_data[i]=handle_data[0];
//基准记录定位待i处,这是基准最后的位置
return(i);
//返回基准位置
QuickSort(intlow,inthigh)//快速排序,递归
intp;
if(low<
high)
{//当前区间长度大于1时才需要排序
p=Partition(low,high);
//对handle_data[low...high]进行划分
快速排序各次划分后的结果:
QuickSort(low,p-1);
//对左区间递归排序
QuickSort(p+1,high);
//对有区间递归排序
SelectSort()//直接选择排序
inti,j,k;
i++)//共进行N-1趟选择
k=i;
//假定handle_data[i..N]中第一个记录handle_data[i]最小
for(j=i+1;
j<
j++)//在无序区搜索关键字最小的记录位置
if(handle_data[j].key<
handle_data[k].key)
k=j;
if(k!
=i)//关键字最小的记录handle_data[k]不是handle_data[i],则交换handle_data[k]和handle_data[i]
handle_data[i]=handle_data[k];
handle_data[k]=handle_data[0];
/*cout<
直接选择排序第"
Sift(intlow,inthigh)//将handle_data[low..high]调整为大根堆
intlarge;
Srec<
temp=handle_data[low];
for(large=2*low;
large<
=high;
large*=2)
if(large<
high&
handle_data[large].key<
handle_data[large+1].key)
large++;
if(temp.key>
=handle_data[large].key)
handle_data[low]=handle_data[large];
low=large;
handle_data[low]=temp;
BuildHeap()//将初始handle_data[i..N]中的记录构建成为大根堆
inti;
for(i=N/2;
i>
0;
i--)
Sift(i,N);
//将handle_data[i..N]调整为堆
HeapSort()//堆排序
BuildHeap();
//将handle_data[i..N]建成初始大根堆
for(i=N;
1;
handle_data[0]=handle_data[1];
//将堆项与堆中最后一个记录交换
handle_data[1]=handle_data[i];
handle_data[i]=handle_data[0];
Sift(1,i-1);
//将handle_data[1..i-1]重新调整为大分堆
堆排序第"
Merge(intlow,intmid,inthigh)//归并两个有序表为一个有序表
r1[N+1];
//临时数组
inti=low,j=mid+1,k=0;
//k是r1的下标,i,j分别为第1,2子表的下标
=mid&
=high)//2个子表均未扫描完时循环
=handle_data[j].key)//将第一个子表放入r1中
r1[k]=handle_data[i];
k++;
else//将第2个子表放入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 实验 报告