1、选择排序
选择排序
1.基本的 选择排序
<1>基本思想
首先从要排序的数中选择最大的数,将它放在第一个位置,然后从剩下的数中选择最大的数放在第二个位置,如此继续,直到最后从剩下的两个数中选择最大的数放在倒数第二个位置,剩下的一个数放在最后位置,完成排序.
下表是六个元素的排序的过程
4 5 7 1 2 3
┗━━┛
5 4 7 1 2 3
┗━━━━┛
7 4 5 1 2 3
┗━━━━━━┛
7 4 5 1 2 3
┗━━━━━━━━━━┛ 第一趟结束
⑦ 4 5 1 2 3
┗━┛
7 5 4 1 2 3
┗━━━┛
7 5 4 1 2 3
┗━━━━━┛
7 5 4 1 2 3
┗━━━━━━━┛ 第二趟结束
7 ⑤ 4 1 2 3
┗━┛
7 5 4 1 2 3
┗━━━┛
7 5 4 1 2 3
┗━━━━━┛ 第三趟结束
7 5 ④ 1 2 3
┗━┛
7 5 4 2 1 3 第四趟结束
┗━━━┛
7 5 4 ③ 1 2
┗━┛ 第五趟结束
7 5 4 3 ② ①
<2>算法实现
for i:=1 to 9 do
for j:=i+1 to 10 do
if a[i]<a[j]
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;
2.改进
以上排序方案每次交换两个元素需要执行三个语句,过多的交换必定要花费许多时间.改进方案是在内循环的比较中找出最大值元素的下标,在内循环结束时才考虑是否要调换.
代码如下
for i:=1 to 9 do
begin
k:=i;
for j:=i+1 to 20 do
if a[j]>a[k]
then k:=j;
if i<k {不可能大于}
then begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;
end;
_____________________________
{Xuan3Ze2Pai2Xu4}
var a:array [1..10]of integer;i,j,k,temp:integer;{Pai2Xu4'>'}
begin
for i:=1 to 10 do readln (a[i]);
for i:=1 to 9 do
begin
k:=i;
for j:=i+1 to 10 do
if a[j]>a[k] then k:=j;
if i<k then begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;
end;
for i:=1 to 10 do writeln (a[i]);
end.
选择排序
1.基本的 选择排序
<1>基本思想
首先从要排序的数中选择最大的数,将它放在第一个位置,然后从剩下的数中选择最大的数放在第二个位置,如此继续,直到最后从剩下的两个数中选择最大的数放在倒数第二个位置,剩下的一个数放在最后位置,完成排序.
下表是六个元素的排序的过程
4 5 7 1 2 3
┗━━┛
5 4 7 1 2 3
┗━━━━┛
7 4 5 1 2 3
┗━━━━━━┛
7 4 5 1 2 3
┗━━━━━━━━━━┛ 第一趟结束
⑦ 4 5 1 2 3
┗━┛
7 5 4 1 2 3
┗━━━┛
7 5 4 1 2 3
┗━━━━━┛
7 5 4 1 2 3
┗━━━━━━━┛ 第二趟结束
7 ⑤ 4 1 2 3
┗━┛
7 5 4 1 2 3
┗━━━┛
7 5 4 1 2 3
┗━━━━━┛ 第三趟结束
7 5 ④ 1 2 3
┗━┛
7 5 4 2 1 3 第四趟结束
┗━━━┛
7 5 4 ③ 1 2
┗━┛ 第五趟结束
7 5 4 3 ② ①
<2>算法实现
for i:=1 to 9 do
for j:=i+1 to 10 do
if a[i]<a[j]
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
end;
2.改进
以上排序方案每次交换两个元素需要执行三个语句,过多的交换必定要花费许多时间.改进方案是在内循环的比较中找出最大值元素的下标,在内循环结束时才考虑是否要调换.
代码如下
for i:=1 to 9 do
begin
k:=i;
for j:=i+1 to 20 do
if a[j]>a[k]
then k:=j;
if i<k {不可能大于}
then begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;
end;
_____________________________
{Xuan3Ze2Pai2Xu4}
var a:array [1..10]of integer;i,j,k,temp:integer;{Pai2Xu4'>'}
begin
for i:=1 to 10 do readln (a[i]);
for i:=1 to 9 do
begin
k:=i;
for j:=i+1 to 10 do
if a[j]>a[k] then k:=j;
if i<k then begin
temp:=a[i];
a[i]:=a[k];
a[k]:=temp;
end;
end;
for i:=1 to 10 do writeln (a[i]);
end.