关于Pascal中的排序

比如说 我要把由1*10^9个数从小到大排列,那一种排序用的时间最短?(希尔,冒泡,插入,快速,二分等等,只要是排序),在内存256M,CPU 2.0GHz的计算机上运算时间超过一秒吗?望给出算法

不用比如说了,一般排序是不会有这么大的数据的。一般用的是快排,但实际上堆排更快一些。

Program heapsort;

var a:array[1..100000] of longint;
n,i:longint;

procedure swap(var a,b:longint);
var t:longint;
begin
t:=a;
a:=b;
b:=t;
end;

procedure heap(i,n:longint);
var j,x:longint;
begin
x:=a[i];
j:=i*2;
while (j<=n) do
begin
if (j<n) and (a[j+1]>a[j]) then inc(j);
if x<a[j] then
begin
a[i]:=a[j];
i:=j;
j:=j*2;
end
else
break;
end;
a[i]:=x;
end;

begin
readln(n);
for i:=1 to n do read(a[i]);
for i:=n div 2 downto 1 do heap(i,n);
for i:=n downto 2 do
begin
swap(a[1],a[i]);
heap(1,i-1);
end;
for i:=1 to n-1 do write(a[i],' ');
writeln(a[n]);
end.

也可以用桶排,不过建议你可以看一看书,效率高的排序一般算法比较难理解的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-11-06
快速排序

var
i,j,sum,w,n:longint;
b:array[1..100000000] of longint;
procedure kp(l,r:longint);
var i,j,x,y:longint;
begin
i:=l;
j:=r;
x:=b[(i+j)div 2];
repeat
while b[i]<x do i:=i+1;
while b[j]>x do j:=j-1;
if not(i>j) then begin
y:=b[i];
b[i]:=b[j];
b[j]:=y;
i:=i+1;
j:=j-1;
end;
until i>j;
if i<r then kp(i,r);
if l<j then kp(l,j);
end;
begin
readln(w);
readln(n);
for i:=1 to n do readln(b[i]);
kp(1,n);
i:=1; j:=n+1; sum:=0;
repeat
inc(i);
dec(j);
if b[i]+b[j]<=w then begin
inc(sum);
inc(i);
dec(j);
end
else
inc(sum);
inc(j);
end;
until i=j
end.
第2个回答  2010-11-06
其实在这里快排、堆排、桶排差不多,希尔慢那么一点点,冒泡估计要n天或月吧
第3个回答  2010-11-07
pascal一定超,pascal不可能开多进程复杂度近30亿,
用c,开多进程加堆排+合并排序,256M是妄想。

pascal 全排列顺序是什么?
如:找12543的下一个排列:从最末位(3)开始向前(左)找,找到第一个比末位数字小的数字(2),把末位数字(3)提到第一个比末位数字小的数字(2)前面,(形成13254),再将原末位数字右边的数字从小到大排列(将“254”排序,整体改为“13245”)。这样子执行m次就可以了,复杂度很小 ...

pascal 简单的排序
选择排序:for i:=1 to n-1 do for j:=i+1 to n do if a[i]<a[j] then begin b:=a[i];a[i]:=a[j];a[j]:=b;end;冒泡排序:for i:=2 to n do for j:=i-1 downto 1 do if a[i]mid do inc(i);while a[j]<mid do dec(j);if j>...

PASCAL的排序法
2、 冒泡法:这是最常用的一种排序方法,其实质是:先把数据存放在数组中,然后从第一个开始,分别与其后所有数据进行比较,如果第一个比其后某个数据小,则交换它们的值,一直到第一个与其后所有数据比较完,这时第一个数据就是最大的一个;然后再把第二个数据再与其后数据进行比较,比较完后,第...

PASCAL 排序
现在一般用两种排序 一种为‘冒泡排序’一种为‘快速排序’冒泡适用于排序量较少,快排用于大于1000个数的排序 冒泡:program dd var a:arrray[0..10000] of integer;i,j,k,n:integer;begin randomize;readln(n);for i:=1 to n begin a[i]:=random(1000);write(a[i]:4);end;for i:=...

Pascal中, 稳定排序是什么意思? 不稳定排序又是什么意思?
稳定排序就是开始时在前面的数在排序时一直在前边,如冒泡、插入、归并等。不稳定排序就是开始时在前面的数在排序时不一定在前边,如选择、快速、基数等。

选择排序Pascal
在Pascal语言中,选择排序算法被定义在一个名为ssort的子程序中,它接受一个整数数组作为输入。该算法的主要步骤如下:首先,从数组的最后一个元素开始,进行n-1轮迭代(n为数组长度)。在每轮中,程序会找到剩余元素中的最大值,将其与当前未排序部分的首个元素交换位置。这一步通过内部嵌套循环实现...

Pascal排序
var a:array[0..1000000] of longint;\/\/基数排序 i,n,x:longint;begin readln(n);\/\/数据规模 for i:=1 to n do begin read(x);\/\/读入x inc(a[x]);\/\/a[x]表示x的个数 end;for i:=1 to 1000000 do while a[i]>0 do\/\/x的个数不为零,有多少个,就输出多少个 begin writ...

关于FREE PASCAL的排序方法
一趟排序: (38 49) (65 97) (13 76) (27 *49)(50) 二趟排序: (38 49 65 97) (13 27 *49 76) (50) 三趟排序: (13 27 38 49 *49 50 65 76 97) pascal 实现排序法 procedure swap(var x,y:integer); var temp:integer; begin temp:=x; x:=y; y:=temp; end; \/...

pascal中如何实现数字的递增(减)排列
一、选择排序(枚举排序)特点:类似与冒泡排序,即使优化后的也比优化后的冒泡排序慢。优点:最容易理解。缺点:最慢。稳定性:稳定。时间复杂性:O(n2)。Ⅰ、未优化 Program sort1a;Var a :array [1..maxInt] of Integer;temp,I,j:Integer;begIn for I := 1 to maxint-1 do for j :=...

pascal 快速排序法
排序的方法有很多,如:冒泡,选择,堆排,插排,快排。。。堆排稳定,效率也不错,但还是需要自定义过程,平均效率最好的就是快排了,但它需要递归实现,不然就是借助背的数据结构,但那只是传说中的大侠可以,我至今没见过,不用子程序,还简单的,你就平方级的冒泡或选择吧,for i:=1 to n-1...

相似回答