排序算法插入、快排、选择、冒泡、堆排序、归并

1.插入排序:

procedure in_sort(var a: array of Integer; k, m: Integer);
var
p: Integer;
begin
p :
= 0;
while p = 0 do
begin
if k >= a[m] then
begin
a[m
+ 1] := k;
p :
= 1;
end
else
begin
a[m
+ 1] := a[m];
Dec(m);
if m = -1 then
begin
a[m
+ 1] := k;
p :
= 1;
end;
end;
end;
end;

2.快速排序:

procedure q_sort(var a: array of Integer; l, r: Integer);
var
i, j, mid, t: Integer;
begin
i :
= l;
j :
= r;
mid :
= a[(l + r) div 2];
while i <= j do
begin
while (a[i] < mid) do
Inc(i);
while (a[j] > mid) do
Dec(j);
if i <= j then
begin
t :
= a[i];
a[i] :
= a[j];
a[j] :
= t;
Inc(i);
Dec(j);
end;
end;
if l < j then
q_sort(a, l, j);
if i < r then
q_sort(a, i, r);
end;

3.选择排序:

procedure sel_sort(var a: array of Integer; l, r: Integer);
var
i, j, k, t: Integer;
begin
for i := l to r do
begin
k :
= i;
for j := i + 1 to r do
begin
if a[j] < a[k] then
k :
= j;
end;
if k <> i then
begin
t :
= a[k];
a[k] :
= a[i];
a[i] :
= t;
end;
end;
end;

4.冒泡排序:

procedure b_sort(var a: array of Integer; l, r: Integer);
//l,r表示上下标
var
i, j, t: Integer;
begin
for i := l to r do
for j := l to i - 1 do
begin
if a[j] > a[i] then
begin
t :
= a[i];
a[i] :
= a[j];
a[j] :
= t;
end;
end;
end;

5.堆排序:

procedure heap_adjust(var a: array of Integer; i, m: Integer);
var
k, t: Integer;
begin
t :
= a[i];
k :
= i * 2;
while k <= m do
begin
if (a[k] < a[k + 1]) and (k < m) then
Inc(k);
if (t < a[k]) then
begin
a[i] :
= a[k];
i :
= k;
k :
= 2 * i; //调整,并为t在下面节点找位置
//k向下探索
end
else
k :
= m + 1;
end;
a[i] :
= t;
end;
procedure he_sort(var a: array of Integer; l, r: Integer);
var
j, t: Integer;
begin
for j := r div 2 to l do
heap_adjust(a, j, r);
//调整堆,初始化
for j := r downto l do
begin
t :
= a[0];
a[
0] := a[j];
a[j] :
= t;
heap_adjust(a, l, j
- 1);
end;
end;

6.归并排序:

procedure merge(var a: array of Integer; l, q, r: Integer);
{将已排序好的子序列a[l..p]与a[q+1..r]合并为有序的tmp[l..r]}
var
i, j, t: Integer;
tmp:
array[0..20] of Integer;
begin
i :
= l;
j :
= q + 1;
t :
= l;
while t <= r do
begin
if ((i <= q) and (a[i] <= a[j])) or (j > r) then
begin
tmp[t] :
= a[i];
Inc(i);
end
else
begin
tmp[t] :
= a[j];
Inc(j);
end;
Inc(t);
end;
for t := l to r do
a[t] :
= tmp[t];
end;
procedure me_sort(var a: array of Integer; l, r: Integer);
var
q: Integer;
begin
if l <> r then
begin
q :
= (l + r) div 2;
me_sort(a, l, q);
me_sort(a, q
+ 1, r);
merge(a, l, q, r);
end;
end;

  

原文地址:https://www.cnblogs.com/wouldguan/p/2153381.html