全国青少年信息学奥林匹克联赛
排序算法
一、插入排序 (Insertion Sort)
1. 基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适
当位置,使数列依然有序;直到待排序数据元素全部插入
完为止。
2. 排序过程:【示例】:
[ 初始关键字 ] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27
38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
Procedure InsertSort(Var R : FileType);
// 对 R[1..N] 按递增序进行插入排序
, R[0] 是监视哨 //
Begin
for I := 2 To N Do
// 依次插入
R[2],...,R[n]//
begin
R[0] := R[I]; J := I - 1;
While R[0] < R[J] Do
// 查找 R[I] 的插入位置 //
begin
R[J+1] := R[J];
// 将大于 R[I] 的元素后移J:=J-1 end
R[J + 1] := R[0] ;
// 插入
R[I] //
end
End; //InsertSort //
//
二、选择排序
1. 基本思想:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排
好序的数列的最后,直到全部待排序的数据元素排完。
2. 排序过程:
【示例】:
初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [ 38 65 97 76 49 27 49] 第二趟排序后 13 27 [65 97 76 49 38 49] 第三趟排序后 13 27 38 [97 76 49 65 49] 第四趟排序后 13 27 38 49 [49 97 65 76] 第五 趟排序后 13 27 38 49 49 [97 97 76] 第六趟排序后 13 27 38 49 49 76 [76 97] 第七趟排序后 13 27 38 49 49 76 76 [ 97] 最后排序结果 13 27 38 49 49 76 76 97
Procedure SelectSort(Var R : FileType);
// 对 R[1..N] 进行直接选择
排序 //
Begin
for I := 1 To N - 1 Do
// 做 N -
1 趟选择排序 //
begin
K:=I;
For J := I + 1 To
N Do R[K]//
// 在当前
无序区 R[I..N] 中选最小的元素
begin
If R[J] < R[K] Then K := J
end;
If K <> I Then // 交
换 R[I] 和 R[K] //
begin Temp := R[I]; R[I] := R[K]; R[K] := Temp; end;
end
End.
//Se
lectSort //
三、冒泡排序 (BubbleSort) 1. 基本思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交
换,直到没有反序的数据元素为止。
2. 排序过程:
设想被排序的数组
R[ 1..N ]垂直竖立,将每个数据元素看作有重量的气泡,根
R,凡扫描到违反本原则的轻
据轻气泡不能在重气泡之下的原则,从下往上扫描数组
气泡,就使其向上 \漂浮 \,如此反复进行,直至最后任何两个气泡都是轻者在上,
重者在下为止。
【示例】:
49 13 13 13 13 13 13 13
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
Procedure BubbleSort(Var R : FileType) //
从下往上扫描的起泡排序
//
Begin
For I := 1 To N-1 Do
// 做 N-1 趟排序 //
begin
NoSwap := True;
// 置未排序的标志
//
For J := N - 1 DownTo 1 Do
// 从底部往上扫描
//
begin
If R[J+1]< R[J] Then
// 交换元素 //
begin
Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp;
NoSwap := False
高中信息技术全国青少年奥林匹克联赛教案排序算法



