数据结构实验报告记录四实现典型的排序算法Word文档下载推荐.docx
- 文档编号:13619090
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:16
- 大小:68.53KB
数据结构实验报告记录四实现典型的排序算法Word文档下载推荐.docx
《数据结构实验报告记录四实现典型的排序算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告记录四实现典型的排序算法Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
四、实验步骤
1.输入记录的基本结点与信息,选用相关的存储结构,完成记录的存储、输入的初始化工作。
2.选择“直接插入排序”,“希尔排序”,“快速排序”,“简单选择排序”和“堆排序”几种排序中的任意三种排序,编程实现排序算法。
用菜单形式选择排序方法,并显示排序过程和排序结果。
3.计算排序算法的时间复杂度并进行稳定性分析。
五、程序源代码及注释
#include"
iostream"
usingnamespacestd;
#defineMAX_NO_OF_KEY8
#defineRADIX10//关键字基数
#defineMAX_SPACE1000
typedefstruct
{
intkeys[MAX_NO_OF_KEY];
//关键字
intdata;
//其他数据项
intnext;
}SLCell;
SLCellr[MAX_SPACE];
//静态链表可利用空间
intkeynum;
//记录的当前关键字个数
intrecnum;
//静态链表的当前长度
}SLList;
typedefintArrType[RADIX];
//指针数组类型
intlen;
//数组长度
//插入排序
voidDirectInsertSort(intElem_Arr[])
inti,j;
for(i=2;
i<
len;
i++)
{
Elem_Arr[0]=Elem_Arr[i];
for(j=i-1;
j>
=1;
j--)
if(Elem_Arr[0]<
Elem_Arr[j])
Elem_Arr[j+1]=Elem_Arr[j];
else
break;
Elem_Arr[j+1]=Elem_Arr[0];
}
}
//希尔排序
voidShellInsert(intElem_Arr[],intadd)//add为某趟希尔排序的增量
for(i=add+1;
for(j=i-add;
0&
&
Elem_Arr[j]>
Elem_Arr[0];
j-=add)
Elem_Arr[j+add]=Elem_Arr[j];
Elem_Arr[j+add]=Elem_Arr[0];
voidShellSort(intElem_Arr[])
intt;
cout<
<
"
请输入增量数组元素个数:
endl;
cin>
>
t;
int*dlta=newint[t];
请依次输入增量数组元素:
for(inti=0;
cin>
dlta[i];
for(intk=0;
k<
++k)
ShellInsert(Elem_Arr,dlta[k]);
//一趟增量为dlta[k]的插入排序
//快速排序
intPartition(intElem_Arr[],inti,intj)//实现一分为二,pivotkey为枢轴变量
intpivotkey;
pivotkey=Elem_Arr[i];
while(i<
j)
{
while(i<
j&
=pivotkey)
--j;
Elem_Arr[i]=Elem_Arr[j];
Elem_Arr[i]<
++i;
Elem_Arr[j]=Elem_Arr[i];
Elem_Arr[i]=pivotkey;
returni;
}//Partition
voidQSort(intElem_Arr[],intlow,inthigh)
intpivotloc;
if(low<
high)
pivotloc=Partition(Elem_Arr,low,high);
QSort(Elem_Arr,low,pivotloc-1);
QSort(Elem_Arr,pivotloc+1,high);
voidQuickSort(intElem_Arr[])
QSort(Elem_Arr,1,len-1);
//简单选择排序
intSelectMin(intElem_Arr[],inti)
intmin=i;
for(intj=i+1;
j<
j++)
if(Elem_Arr[min]>
min=j;
returnmin;
voidSelectSort(intElem_Arr[])
intt,j;
for(inti=1;
++i)
j=SelectMin(Elem_Arr,i);
if(i!
=j)
{
t=Elem_Arr[i];
Elem_Arr[i]=Elem_Arr[j];
Elem_Arr[j]=t;
}
}//SelectSort
//堆排序
voidHeapAdjust(intElem_Arr[],inti,intm)
Elem_Arr[0]=Elem_Arr[i];
for(intj=2*i;
=m;
j*=2)
if(j<
m&
Elem_Arr[j]<
Elem_Arr[j+1])
++j;
if(Elem_Arr[0]>
Elem_Arr[j])
break;
i=j;
Elem_Arr[i]=Elem_Arr[0];
voidHeapSort(intElem_Arr[])
for(inti=(len-1)/2;
i>
0;
--i)
HeapAdjust(Elem_Arr,i,len-1);
for(i=len-1;
1;
Elem_Arr[i]=Elem_Arr[1];
Elem_Arr[1]=Elem_Arr[0];
HeapAdjust(Elem_Arr,1,i-1);
//归并排序
voidMerge(intElem_Arr1[],intElem_Arr[],inti,intm,intn)//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
intj,k;
for(j=m+1,k=i;
=m&
=n;
++k)
//将SR中记录由小到大地并入TR
if(Elem_Arr1[i]<
Elem_Arr1[j])
Elem_Arr[k]=Elem_Arr1[i++];
else
Elem_Arr[k]=Elem_Arr1[j++];
if(i<
=m)//TR[k..n]=SR[i..m];
将剩余的SR[i..m]复制到TR
while(k<
=n&
=m)
Elem_Arr[k++]=Elem_Arr1[i++];
=n)//将剩余的SR[j..n]复制到TR
while(k<
=n)
Elem_Arr[k++]=Elem_Arr1[j++];
}
voidMSort(intElem_Arr1[],intElem_Arr[],ints,intt)//将SR[s..t]归并排序为TR1[s..t]
intm;
intTR2[20];
if(s==t)
Elem_Arr[t]=Elem_Arr1[s];
else
m=(s+t)/2;
//将SR[s..t]平分为SR[s..m]和SR[m+1..t]
MSort(Elem_Arr1,TR2,s,m);
//递归地将SR[s..m]归并为有序的TR2[s..m]
MSort(Elem_Arr1,TR2,m+1,t);
//将SR[m+1..t]归并为有序的TR2[m+1..t]
Merge(TR2,Elem_Arr,s,m,t);
//将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
voidMergeSort(intElem_Arr[])//对顺序表L作归并排序。
int*Elem_Arr1=newint[len];
Elem_Arr1[i]=Elem_Arr[i];
MSort(Elem_Arr1,Elem_Arr,1,len-1);
//基数排序
intsucc(intf[],intj)
intk=j;
for(j;
10;
if(f[j]!
=0)break;
elsek++;
if(j<
10)returnk;
elsereturn0;
voidCreateL(SLList&
L)
{
请依次输入元素:
=L.recnum;
L.r[i].data;
L.r[i].keys[0]=L.r[i].data%10;
L.r[i].keys[1]=(L.r[i].data%100-L.r[i].keys[0])/10;
L.r[i].keys[2]=L.r[i].data/100;
voidDistribute(SLList&
L,inti,ArrType&
f,ArrType&
e)
//算法10.15
//静态链表L的r域中记录已按(keys[0],...,keys[i-1])有序,
//本算法按第i个关键字k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 记录 实现 典型 排序 算法