高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx

上传人:b****3 文档编号:17922929 上传时间:2022-12-12 格式:DOCX 页数:8 大小:18.20KB
下载 相关 举报
高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx_第1页
第1页 / 共8页
高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx_第2页
第2页 / 共8页
高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx_第3页
第3页 / 共8页
高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx_第4页
第4页 / 共8页
高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx

《高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。

高中信息技术 全国青少年奥林匹克联赛教案 排序算法Word文件下载.docx

R[0]:

=R[I];

J:

=I-1;

WhileR[0]<

R[J]Do 

//查找R[I]的插入位置//

R[J+1]:

=R[J];

//将大于R[I]的元素后移//

J:

=J-1

end

R[J+1]:

=R[0];

//插入R[I]//

End;

//InsertSort//

二、选择排序

1.基本思想:

  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

2.排序过程:

【示例】:

初始关键字[4938659776132749]

第一趟排序后13[38659776492749]

第二趟排序后1327[659776493849]

第三趟排序后132738[9776496549]

第四趟排序后13273849[49976576]

第五趟排序后1327384949[979776]

第六趟排序后132738494976[7697]

第七趟排序后13273849497676[97]

最后排序结果1327384949767697

ProcedureSelectSort(VarR:

//对R[1..N]进行直接选择排序//

=1ToN-1Do 

//做N-1趟选择排序//

K:

=I;

ForJ:

=I+1ToNDo 

//在当前无序区R[I..N]中选最小的元素R[K]//

IfR[J]<

R[K]ThenK:

=J

end;

IfK<

>

IThen 

//交换R[I]和R[K]//

beginTemp:

R[I]:

=R[K];

R[K]:

=Temp;

end;

End. 

//SelectSort//

三、冒泡排序(BubbleSort)

  两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

  设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"

漂浮"

,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

4913131313131313

3849272727272727

6538493838383838

9765384949494949

7697654949494949

1376976565656565

2727769776767676

4949497697979797

ProcedureBubbleSort(VarR:

FileType)//从下往上扫描的起泡排序//

ForI:

=1ToN-1Do 

//做N-1趟排序//

NoSwap:

=True;

//置未排序的标志//

=N-1DownTo1Do 

//从底部往上扫描//

IfR[J+1]<

R[J]Then 

//交换元素//

Temp:

=R[J+1];

R[J+1:

R[J]:

=False

IfNoSwapThenReturn 

//本趟排序中未发生交换,则终止算法//

//BubbleSort//

四、快速排序(QuickSort)

  在当前无序区R[1..H]中任取一个数据元素作为比较的"

基准"

(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:

R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

初始关键字[4938659776132749]

第一次交换后[2738659776134949]

第二次交换后[2738499776136549]

J向左扫描,位置不变,第三次交换后[2738139776496549]

I向右扫描,位置不变,第四次交换后[2738134976976549]

J向左扫描[2738134976976549]

(一次划分过程)

初始关键字[4938659776132749]

一趟排序之后[273813]49[76976549]

二趟排序之后[13]27[38]49[4965]76[97]

三趟排序之后1327384949[65]7697

最后的排序结果1327384949657697

各趟排序之后的状态

ProcedureParttion(VarR:

FileType;

L,H:

Integer;

VarI:

Integer);

//对无序区R[1,H]做划分,I给以出本次划分后已被定位的基准元素的位置//

I:

=1;

=H;

X:

=R[I];

//初始化,X为基准//

Repeat

While(R[J]>

=X)And(I<

J)Do

=J-1 

//从右向左扫描,查找第1个小于X的元素//

IfI<

JThen 

//已找到R[J]〈X//

R[I]:

//相当于交换R[I]和R[J]//

=I+1

While(R[I]<

=I+1 

//从左向右扫描,查找第1个大于X的元素///

//已找到R[I]>

X//

begin 

R[J]:

UntilI=J;

=X 

//基准X已被最终定位//

//Parttion//

ProcedureQuickSort(VarR:

FileType;

S,T:

//对R[S..T]快速排序//

IfS<

TThen 

//当R[S..T]为空或只有一个元素是无需排序//

Partion(R,S,T,I);

//对R[S..T]做划分//

QuickSort(R,S,I-1);

//递归处理左区间R[S,I-1]//

QuickSort(R,I+1,T);

//递归处理右区间R[I+1..T]//

//QuickSort//

五、堆排序(HeapSort)

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

2.堆的定义:

N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:

Ki≤K2iKi≤K2i+1(1≤I≤[N/2])

堆实质上是满足如下性质的完全二叉树:

树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。

例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。

这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。

反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。

3.排序过程:

堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。

我们不妨利用大根堆来排序。

每一趟排序的基本操作是:

将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。

这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。

对关键字序列42,13,91,23,24,16,05,88建堆

ProcedureSift(VarR:

I,M:

//在数组R[I..M]中调用R[I],使得以它为完全二叉树构成堆。

事先已知其左、右子树(2I+1<

=M时)均是堆//

X:

=2*I;

//若J<

=M,R[J]是R[I]的左孩子//

WhileJ<

=MDo 

//若当前被调整结点R[I]有左孩子R[J]//

If(J<

M)AndR[J].Key<

R[J+1].KeyThen

=J+1 

//令J指向关键字较大的右孩子//

//J指向R[I]的左、右孩子中关键字较大者//

IfX.Key<

R[J].KeyThen 

//孩子结点关键字较大//

//将R[J]换到双亲位置上//

=J;

=2*I 

//继续以R[J]为当前被调整结点往下层调整//

Else

Exit 

//调整完毕,退出循环//

=X;

//将最初被调整的结点放入正确位置//

//Sift//

ProcedureHeapSort(VarR:

//对R[1..N]进行堆排序//

 Begin

  ForI:

=NDivDownto1Do 

//建立初始堆//

   Sift(R,I,N)

=NDownto2do 

//进行N-1趟排序//

   begin

    T:

=R[1];

R[1]:

=T;

//将当前堆顶记录和堆中最后一个记录交换//

    Sift(R,1,I-1) 

//将R[1..I-1]重成堆//

   end

 End;

//HeapSort//

六、几种排序算法的比较和选择

1.选取排序方法需要考虑的因素:

(1)待排序的元素数目n;

(2)元素本身信息量的大小;

(3)关键字的结构及其分布情况;

(4)语言工具的条件,辅助空间的大小等。

2.小结:

(1)若n较小(n<

=50),则可以采用直接插入排序或直接选择排序。

由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。

(2)若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。

(3)若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:

快速排序、堆排序或归并排序。

快速排序是目前基于比较的内部排序法中被认为是最好的方法。

(4)在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:

当文件的n个关键字随机分布时,任何借助于"

比较"

的排序算法,至少需要O(nlog2n)的时间。

(5)当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。

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

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

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

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