数据结构试验报告各种内排序算法的实现及性能比较Word文档下载推荐.docx
- 文档编号:20737488
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:25
- 大小:19.78KB
数据结构试验报告各种内排序算法的实现及性能比较Word文档下载推荐.docx
《数据结构试验报告各种内排序算法的实现及性能比较Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告各种内排序算法的实现及性能比较Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
voidSelectSort(TA[],intn)
{
intsmall;
for(inti=0;
i<
n-1;
i++){//执行n-1趟
small=i;
for(intj=i+1;
j<
n;
j++)
if(A[j]<
A[small])small=j;
Swap(A[i],A[small]);
}
}
Insertsort.h
//直接插入排序
voidInsertSort(TA[],intn)
for(inti=1;
i++){//执行n-1趟
intj=i;
Ttemp=A[i];
while(j>
0&
&
temp<
A[j-1]){
A[j]=A[j-1];
j--;
}
A[j]=temp;
}/*ok!
*/
Bubblesort.h
voidBubbleSort(TA[],intn)
inti,j,last;
i=n-1;
while(i>
0){
last=0;
for(j=0;
i;
if(A[j+1]<
A[j]){
Swap(A[j],A[j+1]);
last=j;
}
i=last;
Quicksort.h
//改进的快速排序
template<
voidquick(TA[],intn)
{
int*a;
//用数组保存待排序的子序列的上、下界
inttop=0,right,left,j;
//left和right为待排序
a=newint[n];
if(a==NULL)return;
a[top++]=0;
a[top++]=n-1;
//以初始序列为待排序序列开始改进的快速排序
//lc
for(j=0;
a[j]!
=NULL;
j++)//循环到数组元素为空
{
left=a[j++];
right=a[j];
//每次按序从数组中取出两个元素作为待排序序列的上、下界
if(left>
right)
Swap(left,right);
//如果下界大于上界,交换上、下界
if(right-left<
15)
InsertSortExt(A,left,right);
//若元素较少调用插入排序
else
{
a[top++]=left;
a[top++]=QuickSort(A,left,right)-1;
a[top++]=a[top-2]+2;
a[top++]=right;
//否则将低、高端序列上、下界依次保存到数组中
intQuickSort(TA[],intleft,intright)//用于改进的快速排序的原始快速排序方法
inti,j;
if(left<
right){
i=left;
j=right+1;
do{
doi++;
while(A[i]<
A[left]);
doj--;
while(A[j]>
if(i<
j)Swap(A[i],A[j]);
}while(i<
j);
Swap(A[left],A[j]);
returnj;
return0;
voidInsertSortExt(TA[],intleft,intright)//用于快速排序的直接插入排序方法
for(inti=left+1;
right;
//待插入元素存入临时变量
while(j>
0&
temp<
A[j-1]){//从后往前查找插入位置
j--;
//A[j-1]元素后移,j指针前移
//待插入元素存入找到的插入位置
Mergesort.h
//两路合并的C++程序
voidMerge(TA[],inti1,intj1,inti2,intj2)
{//i1,j1是子序列1的下、上界,i1,j2是子序列2的下、上界
T*Temp=newT[j2-i1+1];
//分配能存放两个子序列的临时数组
inti=i1,j=i2,k=0;
//i,j是两个子序列的游动指针,k是Temp的游动指针
while(i<
=j1&
=j2)
if(A[i]<
=A[j])Temp[k++]=A[i++];
elseTemp[k++]=A[j++];
=j1)Temp[k++]=A[i++];
while(j<
=j2)Temp[k++]=A[j++];
for(i=0;
i<
k;
i++)A[i1++]=Temp[i];
delete[]Temp;
//合并排序的C++程序
voidMergeSort(TA[],intn)
inti1,j1,i2,j2;
//i1,j1是子序列1的下、上界,i2,j2是子序列2的下、上界
intsize=1;
//子序列中元素个数,初始化为1。
while(size<
n){
i1=0;
while(i1+size<
i2=i1+size;
j1=i2-1;
if(i2+size-1>
n-1)
j2=n-1;
elsej2=i2+size-1;
Merge(A,i1,j1,i2,j2);
i1=j2+1;
size*=2;
Heapsort.h
//AdjustDown函数
voidAdjustDown(TA[],intr,intj)
intchild=2*r+1;
Ttemp=A[r];
while(child<
=j){
if((child<
j)&
(A[child]<
A[child+1]))child++;
if(temp>
=A[child])break;
A[(child-1)/2]=A[child];
child=2*child+1;
A[(child-1)/2]=temp;
//堆排序的C++程序
voidHeapSort(TA[],intn)
for(inti=(n-2)/2;
i>
-1;
i--)AdjustDown(A,i,n-1);
//构造最大堆
for(i=n-1;
0;
i--){
Swap(A[0],A[i]);
AdjustDown(A,0,i-1);
Meau.h
stdio.h>
stdlib.h>
time.h>
#include"
selectsort.h"
insertsort.h"
bubblesort.h"
quicksort.h"
mergesort.h"
heapsort.h"
#defineSIZE400
#defineTIMES1000
classMenu
public:
voidprintmenu();
voidselectsort();
voidinsertSort();
voidbubbleSort();
//冒泡排序
voidquickSort();
//快速排序
voidmergeSort();
//两路合并排序
voidheapSort();
//堆排序
voidchildmenu();
//子菜单1
voidchildmenu2();
//子菜单2
voidswitcha();
private:
inta,b,c;
};
voidMenu<
T>
:
printmenu()
cout<
<
"
--------------------------------------------------------"
endl;
内排序测试系统"
endl<
1.简单选择排序"
//ok
2.直接插入排序"
3.冒泡排序"
4.快速排序"
5.两路合并排序"
6.堆排序"
7.退出"
PS:
测试用的数组元素为"
SIZE<
时间为重复运行"
TIMES<
次的时间(包括了产生数据与析构的时间)"
this->
switcha();
childmenu()
cout<
1.最好情况"
2.最坏情况"
3.平均情况"
4.返回主菜单"
cin>
>
b;
if(b==4)this->
printmenu();
childmenu2()
1.原始算法"
2.改进算法"
3.返回主菜单"
c;
if(c==3)this->
switcha()
//cout<
ok"
a;
switch(a)
case1:
this->
selectsort();
break;
case2:
insertSort();
case3:
bubbleSort();
case4:
quickSort();
case5:
mergeSort();
case6:
heapSort();
case7:
exit
(1);
default:
cout<
error"
voidprintout(TA[],intn)//打印数组,测试时用
for(inti=0;
i++)
A[i]<
"
;
T*producedate(intx)//产生顺序,逆序,随机的数组
inti;
T*A=newT[SIZE];
switch(x)
for(i=0;
SIZE;
i++)A[i]=i;
returnA;
//顺序
break;
for(i=SIZE;
i>
i--)A[i-1]=SIZE-i;
//逆序
srand(time(NULL));
i++){A[i]=rand()%1000+1;
}returnA;
//随机
voidSwap(T&
a,T&
b)//交换2个元素
Ttemp=a;
a=b;
b=temp;
bubbleSort()
冒泡排序"
this->
childmenu();
T*A;
doubleduration;
clock_tstart,finish;
start=clock();
TIMES;
A=producedate<
(b);
BubbleSort(A,SIZE);
delete[]A;
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
用时:
duration<
system("
pause"
);
//delete[]A;
}/*ok*/
heapSort()
堆排序"
直接用随机数据测试"
(3);
HeapSort(A,SIZE);
insertSort()
直接插入排序"
//A=producedate<
//if(A==NULL){cout<
delete[]A;
InsertSort(A,SIZE);
mergeSort()
//this->
合并排序"
MergeSort(A,SIZE);
quickSort()
childmenu2();
if(c==1)
原始快速排序"
start=clock();
for(inti=0;
A=producedate<
QuickSort2(A,SIZE);
delete[]A;
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
elseif(c==2)
改进的快速排序"
/*A=producedate<
printout(A,SIZE);
quick(A,SIZE);
delete[]A;
*/
//T*A;
quick(A,SIZE);
else{cout<
selectsort()
简单选择排序"
SelectSort(A,SIZE);
/*ok!
Mymain.cpp
Menu.h"
intmain()
Menu<
int>
MenuObj;
MenuObj.printmenu();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验报告 各种 排序 算法 实现 性能 比较