数据结构实验6排序2Word文件下载.docx

上传人:b****5 文档编号:16234220 上传时间:2022-11-21 格式:DOCX 页数:10 大小:355.72KB
下载 相关 举报
数据结构实验6排序2Word文件下载.docx_第1页
第1页 / 共10页
数据结构实验6排序2Word文件下载.docx_第2页
第2页 / 共10页
数据结构实验6排序2Word文件下载.docx_第3页
第3页 / 共10页
数据结构实验6排序2Word文件下载.docx_第4页
第4页 / 共10页
数据结构实验6排序2Word文件下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据结构实验6排序2Word文件下载.docx

《数据结构实验6排序2Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验6排序2Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。

数据结构实验6排序2Word文件下载.docx

charname[10];

//姓名

intenglish;

//成绩

intmath;

};

classSqHash

public:

ElemType*ht,*z;

//表数组

intlength;

intcouts;

//表大小(长度)

//KeyTypep;

//除留余数法的大质数

SqHash(intn1,intp1);

~SqHash()

{

delete[]ht;

length=0;

};

voidcreat_hash();

//intfind(KeyTypek);

intsort1();

//voidcreat_hash();

voidPrintOut();

SqHash:

:

SqHash(intn1,intp1)

intp;

length=n1;

p=p1;

ht=newElemType[length];

for(inti=0;

i<

length;

i++)

ht[i].key=-1;

}

voidSqHash:

creat_hash()

inti,K,en,ma;

i=0;

charna[10];

cout<

<

"

\n请逐一输入各个学号(关键字值)(-1结束):

;

cin>

>

K;

couts=0;

while(K!

=-1&

&

length)

{

//cout<

\n请输入学生的姓名,英语成绩和高数成绩:

//cin>

na>

en>

ma;

ht[i].key=K;

//strcpy(ht[i].name,na);

//用串拷贝赋值

//ht[i].english=en;

//ht[i].math=ma;

// 插入学生记录K

\n插入成功!

;

i++;

couts++;

//查询某关键字的记录

intSqHash:

sort1()

inti,j,k=1;

intll[1];

//元素从1开始存储,couts表示数组中含有元素个数,此处即为最后一个元素的下标

for(i=2;

=couts;

if(ht[i].key<

ht[i-1].key)

{

ll[1]=ht[0].key;

ht[0]=ht[i];

//设置监视哨

for(k;

k<

=1;

k+2)

ht[0].key=ll[1];

for(j=i-1;

ht[0].key<

ht[j].key;

j--)

ht[j+1].key=ht[j].key;

ht[j+1].key=ht[0].key;

}

}

if(i!

=0)

return1;

else

return0;

PrintOut()

inti,j;

for(i=0;

couts+10;

i++)

if(ht[i].key!

=-1)

\ni="

学号:

ht[i].key;

//<

姓名:

ht[i].name

英语成绩:

ht[i].english<

高数成绩:

ht[i].math;

intmain()

intp0,n0;

\n请输入n值(n值应是记录总数的1.3-1.5倍)"

n0;

\n请输入P值(应是不大于n的大质数):

p0;

SqHashha(n0,p0);

ElemTypea;

intk;

do{

\n\n\n"

\n1.建立表"

\n2.对学生记录排序"

\n3.输出表"

\n4.结束"

\n======================================="

\n输入您的选择(1,2,3,4):

k;

switch(k)

case1:

ha.creat_hash();

}break;

case2:

\n排序学生数据:

inti=ha.sort1();

if(i==-1)

\n排序不成功"

endl;

cout<

排序成功!

case3:

ha.PrintOut();

}while(k>

=1&

=3);

 

3.实验结果

1.运行与建表

2.输出表(排序前)

3.排序

4.输出表(排序后)

5.结束

4.实验总结

Shell排序(ShellSort)

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。

平均效率是O(nlogn)。

其中分组的合理性会对算法产生重要的影响。

现在多用D.E.Knuth的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。

Shell排序比起QuickSort,MergeSort,HeapSort慢很多。

但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。

它对于数据量较小的数列重复排序是非常好的。

Shell排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;

当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。

所以,希尔排序的时间复杂度会比o(n^2)好一些。

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

快速排序(QuickSort)

快速排序是一个就地排序,分而治之,大规模递归的算法。

从本质上来说,它是归并排序的就地版本。

快速排序可以由下面四步组成:

(1)如果不多于1个数据,直接返回。

(2)一般选择序列最左边的值作为支点数据。

(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。

(4)对两边利用递归排序数列。

快速排序比大部分排序算法都要快。

尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。

快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。

快速排序有两个方向,左边的i下标一直往右走,而右边的j下标一直往左走,比如序列为53343891011,现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1