浅谈自由帕斯卡的排序方法

一、插入排序:(简单排序)时间复杂度:O (n 2)

(1)直接插入-稳定排序

(2)拆卸和半插入稳定排序

(3)双向插入排序-稳定排序

(4)表格插入排序-稳定排序

(5)希尔排序——不稳定排序。

二、快速(交换)排序:(平均时间复杂度:O(nlogn),最坏情况:O(N2))-不稳定排序。

(1)冒泡排序-稳定排序

(2)快速排序

三、选择排序:(平均时间复杂度:O(nlogn),最坏情况:O(NLOGN))-不稳定排序。

(1)简单选择排序

(2)树选择排序

(3)堆排序((2)排序的改进)

四、归并排序:(平均时间复杂度:O(nlogn),最坏情况:O(nlogn))

(1)双向合并排序

5.基数排序:(平均时间复杂度:O(d(n+rd))、最坏情况:O(d(n+rd))-稳定排序。

稳定排序:排序过程中元素的相对位置没有发生变化的排序称为稳定排序。

不稳定排序:排序过程中元素相对位置发生变化的排序称为不稳定排序。

首先,插入排序:

(1)直接插入:

示例:初始状态:(49) 38 65 97 76 13 27 *49

i=2 (38) (38 49)

i=3 (65) (38 49 65)

i=4 (97) (38 49 65 97)

i=5 (76) (38 49 65 76 97)

I = 6(13)(13 38 49 65 76 97)

i=7 (27) (13 27 38 49 65 76 97)

I = 8(49)(13 27 38 49 * 49 65 76 97)

(2)拆除和插入:

示例:初始状态:49 38 65 97 76 13 27 *49

proc bin pass(var r:listtype;)

(3) 2路插入排序:设置两个指针:first——头总是指向最小的元素,final——尾总是指向最大的元素。

示例:初始状态:49 38 65 97 76 13 27 *49

i=1 (49)

i=2 (49) (38)

i=3 (49 65) (38)

i=4 (49 65 97) (38)

i=5 (49 65 76 97) (38)

i=6 (49 65 76 97) (13 38)

i=7 (49 65 76 97) (13 27 38)

i=8 (49 *49 65 76 97) (13 27 38)

(4)希尔排名:(O(logn)最好,O (n 2)最差)

示例:初始状态:49 38 65 97 76 13 27 *49 55 04

| |

| |

| |

| |

| |

一次性排序结果:13 27 *49 55 04 49 38 65 97 76

| | | |

| | |

| | |

两遍排序的结果:13 04 *49 38 27 49 55 65 97 76

三遍排序的结果:04 13 27 38 *49 49 55 65 76 97

增量公式:...9,5,3,2,1

...40,13,4,1

(5)简单排序:49 38 65 97 76 13 27 *49

38 65 13 27

38 13

排序一次的结果是13。

(6)堆排序:

堆的定义:n个元素的序列{K1,K2,...,KN}称为堆当且仅当满足以下关系时:

k(I)& lt;=k(2i)或k(i)>=k(2i)

k(I)& lt;=k(2i+1) k(i)>=k(2i+1)

(7)合并排序:

示例:初始状态:49 38 65 97 76 13 27 *49 50

一次行程排序:(38 49)(65 97)(65 438+03 76)(27 * 49)(50)

两遍排序:(38 49 65 97) (13 27 *49 76) (50)

三遍排序:(13 27 38 49 *49 50 65 76 97)

Pascal实现排序方法

过程交换(var x,y:integer);

定义变量

temp:整数;

开始

temp:= x;

x:= y;

y:= temp;

结束;

//冒泡排序

过程BubbleSort(变量A:整数数组);

定义变量

I,J,T:整数;

开始

从高到低做

对于J :=低(A)到高(A) - 1 do

如果A[J]& gt;A[J + 1]然后

开始

swap(A[J],A[J+1]);

t:= A[J];

A[J]:= A[J+1];

a[J+1]:= T;

结束;

结束;

//选择排序

procedure SelectionSort(var A:整数数组);

定义变量

I,J,T:整数;

开始

对于I :=低(A)到高(A) - 1 do

对于J := High(A) downto I + 1 do

如果A[I]& gt;那么

开始

Swap(A[I],A[J]);

t:= A[I];

A[I]:= A[J];

a[J]:= T;

如果终止,则退出;

结束;

结束;

//快速排序

过程快速排序(变量A:整数数组);

过程QuickSortSub(var A:整数数组;iLo、iHi:整数);

定义变量

Lo,Hi,Mid,T:整数;

开始

lo:= iLo;

hi:= iHi;

mid:= A[(Lo+Hi)div 2];

重复

而A[Lo]& lt;Mid do公司(Lo);

而A[Hi]>十二月中旬(喜);

如果Lo & lt你好

开始

Swap(A[Lo],A[Hi]);

t:= A[Lo];

A[Lo]:= A[Hi];

a[Hi]:= T;

Inc(Lo);

Dec(喜);

结束;

直到Lo & gt嗨;

如果嗨& gtiLo then QuickSortSub(A,iLo,Hi);

如果Lo & ltiHi then QuickSortSub(A,Lo,iHi);

结束;

开始

QuickSortSub(A,低(A),高(A));

结束;

Pascal 2007-04-18 16:16程序Inssort

const max = 100;

类型arr=array[0..max]的整数;

var a:arr;

I,n:整数;

fin:文本;

过程in sort(var r:arr;rn:整数);{直接插入排序算法}

var i,j:整数;

开始

对于i:=2到rn do

开始

r[0]:= r[I];{存储要插入到监视栏r[0]中的记录}

j:= I-1;

while(r[0]& lt;r[j])do {找到插入位置}

开始

r[j+1]:= r[j];{记录向后移动}

第十届会议;

结束;

r[j+1]:= r[0];{插入要插入排序序列的记录}

结束;

结束;

开始

assign(fin,' input . txt ');

复位(鳍);

readln(fin,n);

for i:=1到n do read(fin,a[I]);

write('排序前:');

对于i:=1到n做写(a[I]:5);writeln

in sort(a,n);

write('排序后:');

对于i:=1到n做写(a[I]:5);writeln

关闭(鳍);

readln

结束。

合并排序[Pascal]

类型元素=数组[0..10001]的整数;

var arrhead,arrend:longint;

n,I:longint;

a:元素;

过程合并(var a:element;x,y,z:longint);

var temp1,temp 2:element;

lengthA,lengthB,I,j,count:longint;

开始

对于i:=x到y do temp 1[I-x+1]:= a[I];

对于j:=y+1到z do temp 2[j-y]:= a[j];

length a:= y-x+1;

length b:= z-y;

I:= 1;j:= 1;计数:= x-1;

while(我& lt=lengthA)和(j & lt=长度B) do

开始

inc(计数);

if temp 1[I]& gt;temp2[j]然后开始一个[计数]:= temp 2[j];Inc(j);结束

否则开始一个[count]:= temp 1[I];inc(一);结束;

结束;

如果我& gtlengthA然后for i:=j to lengthB做a[count+i-j+1]:=temp2[i]

else for j:=i to lengthA做a[count+j-I+1]:= temp 1[j];

结束;

过程排序(变量a:元素;x,y:longint);

var mid:longint;

开始

mid:=(x+y)div 2;

如果mid & lt& gtx然后排序(a,x,mid);

如果mid+1 & lt;& gty然后排序(a,mid+1,y);

merge(a,x,mid,y);

结束;

开始

读作(n);

对于i:=1到n做read(a[I]);

arr head:= 1;

arrend:= n;

sort(a,arrhead,arrend);

对于i:=1到n do begin write(a[i],' ');如果i mod 5=0,那么writeln结束;

结束。

气泡分类

过程冒泡排序(变量R:文件类型)

开始

对于i:=1到n-1 do // Do N-1次排序。

no swap:= true;//交换符号

对于j:=n-1 downto i do //从后向前扫描。

如果R[j+1]。key & ltR[j]。那就按键

temp:= R[j+1];

R[j+1]:= R[j];

r[j]:= temp;

noswap:=false

endif

endfor

如果没有交换,则//如果没有交换发生,则停止算法。

返回;

endif

结束

结束;

直接选择排序

过程select sort(var R:filetype);

开始

对于i:=1到n-1 do

k:= I;

对于j:=i+1到n do

如果R[j]。key & ltR[k]。那就按键

k:=j

endif

endfor

如果k不等于I那么//靠,不能用那个符号,屏蔽够了。

temp:R[I];

R[I]:= R[k];

r[k]:=温度

endif

结束

结束;

堆排序的Pascal实现

//这个程序实现了一个小根堆(满足父比子小的天性)

//程序实现的功能有:堆排序,取最小元素。

//数组最终将按降序排序。

const maxn = 1000;

var a:array[1..maxn]of longint;

尺寸:longint

I,n:longint;

过程交换(var a,b:longint);

var t:longint;

开始

t:= a;

a:= b;

b:= t;

结束;

过程插入(x:longint);

var p:longint;

开始

inc(大小);

p:=大小;

while (a[p div 2]>x)和(p & gt1)开始吧

a[p]:= a[p div 2];

p:= p div 2;

结束;

a[p]:= x;

结束;

过程堆(idx:longint);

var l,r,low:longint;

开始

l:= 2 * idx;

r:= 2 * idx+1;

if(a[l]& lt;a[idx])和(l & lt=size)然后低:=l

else低:= idx

if(a[r]& lt;a[低])和(r & lt=size)那么低:= r;

如果idx & lt& gt●然后开始

swap(a[idx],a[low]);

heapfy(低);

结束;

结束;

函数getmin:longint;

开始

退出(a[1]);

结束;

函数pop:longint;

开始

pop:= a[1];

a[1]:= a[size];

dec(大小);

heap fy(1);

结束;

开始

readln(n);

大小:= 0;

对于i:=1到n do

插入(随机(1000));

对于i:=1到n do

a[n-I+1]:= pop;

对于i:=1到n做写(a[i],' ');

writeln

结束。