delphi实现惯用的几种排序算法
delphi实现常用的几种排序算法
1.冒泡排序
2.选择排序
3.插入排序
4.希尔排序
5.快速排序
6.归并排序
7.堆排序
------解决思路----------------------
已收藏,谢谢!
------解决思路----------------------
还在坚守DELPHI 值得赞美,
------解决思路----------------------
总结与实验,非常清晰。顶!
------解决思路----------------------
支持楼主总结
------解决思路----------------------
快速排序是递归调用,如果层次太深那么就会stack over flow,当然这个跟程序设置stack大小有关系。
100w的快速排序这么慢不科学。
另外我想说的是快速排序的i:=L;并不是最好的选择。
最后我想说的是LZ的实验只做了10000以上,你可以考虑做<20的排序,但是每种做10000次算算总时间,你会发现其他的现象。或许你就能对算法进行优化了。
------解决思路----------------------
好有耐心的啊、
------解决思路----------------------
谢谢楼主分享
------解决思路----------------------
楼主总算走上正途了
------解决思路----------------------

------解决思路----------------------
快速排序 不应该这么慢吧?!
据说它遇到 接近已经排序的数据 时,才特别慢。。。。你的测试数据是顺序的吗?
------解决思路----------------------
同意,快速排序对很顺的数据排序比较慢,所以才说他的i的选择并不好。可以改进避免这种情况。
------解决思路----------------------
多年没看到妖哥了。想想离开bcb这么多年了。
------解决思路----------------------
为避免这种情况,
我建议为 快速排序算法 增加一个预处理:随机打乱(按洗牌算法)
加了这样预处理后,开销仍然是n*ln(n)
------解决思路----------------------
留个丫子,学习了
------解决思路----------------------
没有必要这么麻烦,你这还是会导致算法变慢。
------解决思路----------------------
希尔排序为什么没有继续下去?
------解决思路----------------------
learning
------解决思路----------------------
拿各种数据测试快速排序时,发现随机的数据反而是最慢的?
在虚拟机:
array len=999999
顺序:00:00.093
顺序,1/5为随机数:00:00.219
顺序,1/50为随机数:00:00.141
倒序:00:00.078
倒序(从32位最大正整数开始):00:00.110
随机(0-$7fffff):00:00.344
随机(0-$7fffffff):00:00.296
array len=999999
顺序:00:00.125
顺序,1/5为随机数:00:00.218
顺序,1/50为随机数:00:00.172
倒序:00:00.094
倒序(从32位最大正整数开始):00:00.093
随机(0-$7fffff):00:00.282
随机(0-$7fffffff):00:00.312
在宿主机:
array len=999999
顺序:00:00.079
顺序,1/5为随机数:00:00.207
顺序,1/50为随机数:00:00.145
倒序:00:00.083
倒序(从32位最大正整数开始):00:00.104
随机(0-$7fffff):00:00.311
随机(0-$7fffffff):00:00.283
array len=999999
顺序:00:00.079
顺序,1/5为随机数:00:00.198
顺序,1/50为随机数:00:00.151
倒序:00:00.085
倒序(从32位最大正整数开始):00:00.088
随机(0-$7fffff):00:00.299
随机(0-$7fffffff):00:00.303
------解决思路----------------------
很好
------解决思路----------------------
好帖,整理的非常清晰。
------解决思路----------------------
不错,收藏下
------解决思路----------------------
delphi 现在还有人用啊
------解决思路----------------------
测试结果有点意思:
****就是楼主的快速排序算法
****rnd是预先多进行一轮打乱
my是我网上找的一个改进的快速排序算法——不怕数据是已排序的,而且堆栈开销也低很多,但是完全随机的数据,它略慢
array len=100000
顺序:
**** :00:03.664
****Rnd:00:00.010
my :00:00.007
顺序,1/5为随机数
**** :00:00.008
****Rnd:00:00.010
my :00:00.016
顺序,1/50为随机数
**** :00:00.013
****Rnd:00:00.009
my :00:00.017
倒序
**** :00:03.703
****Rnd:00:00.012
my :00:00.009
倒序(从32位最大正整数开始):
**** :00:03.680
****Rnd:00:00.009
my :00:00.008
随机(0-$7fffff)
**** :00:00.009
my :00:00.026
随机(0-$7fffffff)
**** :00:00.009
my :00:00.026
array len=100000
顺序:
**** :00:03.660
****Rnd:00:00.009
my :00:00.010
顺序,1/5为随机数
**** :00:00.011
****Rnd:00:00.010
my :00:00.019
顺序,1/50为随机数
**** :00:00.014
****Rnd:00:00.011
my :00:00.015
倒序
**** :00:03.615
****Rnd:00:00.010
my :00:00.007
倒序(从32位最大正整数开始):
**** :00:03.622
****Rnd:00:00.011
my :00:00.008
随机(0-$7fffff)
**** :00:00.010
****Rnd:00:00.010
my :00:00.024
随机(0-$7fffffff)
**** :00:00.009
****Rnd:00:00.010
my :00:00.024
【网上找的一个改进的快速排序算法】
------解决思路----------------------
好帖,整理的非常清晰。不错,收藏下
------解决思路----------------------
顶。收藏学习下
------解决思路----------------------
Delphi的帖子,得顶一下
------解决思路----------------------

------解决思路----------------------
补充一个js的,虽然代码是js,但是说明比较详细:
http://www.codeceo.com/article/javascript-9-sort-algorithms.html
------解决思路----------------------
弱弱的问一下,现在Delphi在那些领域使用。自己没有再使用Delphi已经6-7年了。。。
------解决思路----------------------
在移动开发方便、稳定之前,Delphi擅长的领域 并没有变化
------解决思路----------------------
有鸟用?????????????
------解决思路----------------------
说实话,像楼主代码里的不定长数组这类东西,我都不太会。。现在毕竟大部分代码还是用C++写。。
只有自己写一些GUI程序会用delphi,因为实在不通MFC等那些玩意。。
------解决思路----------------------
还好 :-) 之前主要是用Delphi做C/S架构的ERP系统什么的,当时觉着这东西简直好用的神了
------解决思路----------------------
从方便开发者的角度看,delphi是空前绝后的。。。。
所以用过delphi,再用别的语言工具,都觉得是回到原始社会了
------解决思路----------------------
随机化快排会好些.
------解决思路----------------------
mark之,有用!
------解决思路----------------------
支持一下,第一次看到用delphi研究算法的,嘿嘿。只要看到算法的东西都是c代码。
------解决思路----------------------
楼主的快速排序代码不对,这是Delphi自带的快速排序,速度遥遥领先其他所有算法,
而且即使1千万个数据也没有栈溢出
1.冒泡排序
procedure BubbleSort(var x:array of integer);
var
i,j,intTmp:integer;
begin
for i:=0 to high(x) do
begin
for j:=0 to high(x)-1 do
begin
if x[j]>x[j+1] then
begin
intTmp:=x[j];
x[j]:=x[j+1];
x[j+1]:=intTmp;
end;
end;
end;
end;
2.选择排序
procedure SelectSort(var x:array of integer);
var
i,j,k,intTmp:integer;
begin
for i:=0 to high(x)-1 do
begin
intTmp:=x[i];
k:=i;
for j:=i+1 to high(x) do
begin
if intTmp>x[j] then
begin
k:=j;
intTmp:=x[k];
end;
end;
if k<>i then
begin
x[k]:=x[i];
x[i]:=intTmp;
end;
end;
end;
3.插入排序
procedure InsertSort(var x:array of integer);
var
i,j,intTmp:integer;
begin
for i:=1 to high(x) do
begin
for j:=i downto 1 do
begin
if x[j-1]>x[j] then
begin
intTmp:=x[j-1];
x[j-1]:=x[j];
x[j]:=intTmp;
end;
end;
end;
end;
4.希尔排序
procedure ShellSort(var x:array of integer);
var
h,i,j,intTmp:integer;
begin
h:=high(x) div 2;
while h>0 do
begin
for i:=h to high(x) do
begin
j:=i;
while (j>=h) and (x[j-h]>x[j]) do
begin
intTmp:=x[j-h];
x[j-h]:=x[j];
x[j]:=intTmp;
j:=j-h;
end;
end;
h:=h div 2;
end;
end;
5.快速排序
procedure QuickSort(var x:array of integer; L,R:integer);
var
i,j,intTmp:integer;
begin
if L<R then
begin
i:=L;
j:=R;
intTmp:=x[i];
while i<j do
begin
while (i<j) and (x[j]>=intTmp) do
begin
j:=j-1;
end;
if i<j then x[i]:=x[j];
while (i<j) and (x[i]<=intTmp) do
begin
i:=i+1;
end;
if i<j then x[j]:=x[i];
end;
x[i]:=intTmp;
QuickSort(x,L,i-1);
QuickSort(x,i+1,R);
end;
end;
6.归并排序
procedure Merge(var x,y:array of integer; L,M,R:integer);
var
i,j:integer;
begin
i:=L;
j:=M+1;
while (L<=M) and (j<=R) do
begin
if x[L]> x[j] then
begin
y[i]:=x[j];
j:=j+1;
end
else
begin
y[i]:=x[L];
L:=L+1;
end;
i:=i+1;
end;
while L<=M do
begin
y[i]:=x[L];
i:=i+1;
L:=L+1;
end;
while j<=R do
begin
y[i]:=x[j];
i:=i+1;
j:=j+1;
end;
end;
procedure MergeSort(var x, y:TArrInt);
var
intLength,intLen,intLen_m,i:integer;
tmp:TArrInt;
begin
intLength:=high(x)+1;
intLen:=1;
while intLen<intLength do
begin
intLen_m:=intLen;
intLen:=intLen*2;
i:=0;
while i+intLen<intLength do
begin
Merge(x,y,i,i+intLen_m-1,i+intLen-1);
i:=i+intLen;
end;
if i+intLen_m<intLength then
begin
Merge(x,y,i,i+intLen_m-1,intLength-1);
end;
tmp:=x;
x:=y;
y:=tmp;
end;
end;
7.堆排序
procedure HeapAdjust(var x:array of integer; i,intLen:integer);
var
intTmp,intChild:integer;
begin
intTmp:=x[i];
intChild:=2*i+1;
while intChild<intLen do
begin
if (intChild+1<intLen) and (x[intChild]<x[intChild+1]) then
begin
intChild:=intChild+1;
end;
if x[i]<x[intChild] then
begin
x[i]:=x[intChild];
i:=intChild;
intChild:=2*i+1;
end
else
begin
break;
end;
x[i]:=intTmp;
end;
end;
procedure BuildHeap(var x:array of integer);
var
i:integer;
begin
for i:=high(x) div 2 downto 0 do
begin
HeapAdjust(x,i,High(x)+1);
end;
end;
procedure HeapSort(var x:array of integer);
var
i,intTmp:integer;
begin
BuildHeap(x);
for i:=high(x) downto 0 do
begin
intTmp:=x[i];
x[i]:=x[0];
x[0]:=intTmp;
HeapAdjust(x,0,i);
end;
end;
------解决思路----------------------
已收藏,谢谢!
------解决思路----------------------
还在坚守DELPHI 值得赞美,
------解决思路----------------------
总结与实验,非常清晰。顶!
------解决思路----------------------
支持楼主总结
------解决思路----------------------
快速排序是递归调用,如果层次太深那么就会stack over flow,当然这个跟程序设置stack大小有关系。
100w的快速排序这么慢不科学。
另外我想说的是快速排序的i:=L;并不是最好的选择。
最后我想说的是LZ的实验只做了10000以上,你可以考虑做<20的排序,但是每种做10000次算算总时间,你会发现其他的现象。或许你就能对算法进行优化了。
------解决思路----------------------
好有耐心的啊、
------解决思路----------------------
谢谢楼主分享
------解决思路----------------------
楼主总算走上正途了
------解决思路----------------------
------解决思路----------------------
快速排序 不应该这么慢吧?!
据说它遇到 接近已经排序的数据 时,才特别慢。。。。你的测试数据是顺序的吗?
------解决思路----------------------
同意,快速排序对很顺的数据排序比较慢,所以才说他的i的选择并不好。可以改进避免这种情况。
------解决思路----------------------
楼主总算走上正途了
多年没看到妖哥了。想想离开bcb这么多年了。
------解决思路----------------------
性能测试对比
单位:毫秒![]()
快速排序 不应该这么慢吧?!
据说它遇到 接近已经排序的数据 时,才特别慢。。。。你的测试数据是顺序的吗?
同意,快速排序对很顺的数据排序比较慢,所以才说他的i的选择并不好。可以改进避免这种情况。
为避免这种情况,
我建议为 快速排序算法 增加一个预处理:随机打乱(按洗牌算法)
加了这样预处理后,开销仍然是n*ln(n)
------解决思路----------------------
留个丫子,学习了
------解决思路----------------------
性能测试对比
单位:毫秒![]()
快速排序 不应该这么慢吧?!
据说它遇到 接近已经排序的数据 时,才特别慢。。。。你的测试数据是顺序的吗?
同意,快速排序对很顺的数据排序比较慢,所以才说他的i的选择并不好。可以改进避免这种情况。
为避免这种情况,
我建议为 快速排序算法 增加一个预处理:随机打乱(按洗牌算法)
加了这样预处理后,开销仍然是n*ln(n)
没有必要这么麻烦,你这还是会导致算法变慢。
------解决思路----------------------
希尔排序为什么没有继续下去?
------解决思路----------------------
learning
------解决思路----------------------
拿各种数据测试快速排序时,发现随机的数据反而是最慢的?
在虚拟机:
array len=999999
顺序:00:00.093
顺序,1/5为随机数:00:00.219
顺序,1/50为随机数:00:00.141
倒序:00:00.078
倒序(从32位最大正整数开始):00:00.110
随机(0-$7fffff):00:00.344
随机(0-$7fffffff):00:00.296
array len=999999
顺序:00:00.125
顺序,1/5为随机数:00:00.218
顺序,1/50为随机数:00:00.172
倒序:00:00.094
倒序(从32位最大正整数开始):00:00.093
随机(0-$7fffff):00:00.282
随机(0-$7fffffff):00:00.312
在宿主机:
array len=999999
顺序:00:00.079
顺序,1/5为随机数:00:00.207
顺序,1/50为随机数:00:00.145
倒序:00:00.083
倒序(从32位最大正整数开始):00:00.104
随机(0-$7fffff):00:00.311
随机(0-$7fffffff):00:00.283
array len=999999
顺序:00:00.079
顺序,1/5为随机数:00:00.198
顺序,1/50为随机数:00:00.151
倒序:00:00.085
倒序(从32位最大正整数开始):00:00.088
随机(0-$7fffff):00:00.299
随机(0-$7fffffff):00:00.303
------解决思路----------------------
很好
------解决思路----------------------
好帖,整理的非常清晰。
------解决思路----------------------
不错,收藏下
------解决思路----------------------
delphi 现在还有人用啊
------解决思路----------------------
测试结果有点意思:
****就是楼主的快速排序算法
****rnd是预先多进行一轮打乱
my是我网上找的一个改进的快速排序算法——不怕数据是已排序的,而且堆栈开销也低很多,但是完全随机的数据,它略慢
array len=100000
顺序:
**** :00:03.664
****Rnd:00:00.010
my :00:00.007
顺序,1/5为随机数
**** :00:00.008
****Rnd:00:00.010
my :00:00.016
顺序,1/50为随机数
**** :00:00.013
****Rnd:00:00.009
my :00:00.017
倒序
**** :00:03.703
****Rnd:00:00.012
my :00:00.009
倒序(从32位最大正整数开始):
**** :00:03.680
****Rnd:00:00.009
my :00:00.008
随机(0-$7fffff)
**** :00:00.009
my :00:00.026
随机(0-$7fffffff)
**** :00:00.009
my :00:00.026
array len=100000
顺序:
**** :00:03.660
****Rnd:00:00.009
my :00:00.010
顺序,1/5为随机数
**** :00:00.011
****Rnd:00:00.010
my :00:00.019
顺序,1/50为随机数
**** :00:00.014
****Rnd:00:00.011
my :00:00.015
倒序
**** :00:03.615
****Rnd:00:00.010
my :00:00.007
倒序(从32位最大正整数开始):
**** :00:03.622
****Rnd:00:00.011
my :00:00.008
随机(0-$7fffff)
**** :00:00.010
****Rnd:00:00.010
my :00:00.024
随机(0-$7fffffff)
**** :00:00.009
****Rnd:00:00.010
my :00:00.024
【网上找的一个改进的快速排序算法】
unit UnitQuickSort;
interface
type
TfunCompare=function (data:pointer;a,b:Integer):Integer;
TfunExchange=procedure (data:pointer;a,b:Integer);
procedure QuickSort(data:pointer; L, R: Integer; SCompare: TfunCompare;ExchangeItems: TfunExchange);
implementation
procedure QuickSort(data:pointer; L, R: Integer; SCompare: TfunCompare;ExchangeItems: TfunExchange);
var
I, J, P: Integer;
begin
repeat
I := L;
J := R;
P := (L + R) shr 1;
repeat
while SCompare(data,I, P) < 0 do Inc(I);
while SCompare(data,J, P) > 0 do Dec(J);
if I <= J then
begin
ExchangeItems(data,I, J);
if P = I then
P := J
else if P = J then
P := I;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then QuickSort(data, L, J, SCompare, ExchangeItems);
L := I;
until I >= R;
end;
end.
------解决思路----------------------
好帖,整理的非常清晰。不错,收藏下
------解决思路----------------------
顶。收藏学习下
------解决思路----------------------
Delphi的帖子,得顶一下
------解决思路----------------------
------解决思路----------------------
补充一个js的,虽然代码是js,但是说明比较详细:
http://www.codeceo.com/article/javascript-9-sort-algorithms.html
------解决思路----------------------
弱弱的问一下,现在Delphi在那些领域使用。自己没有再使用Delphi已经6-7年了。。。
------解决思路----------------------
弱弱的问一下,现在Delphi在那些领域使用。自己没有再使用Delphi已经6-7年了。。。
在移动开发方便、稳定之前,Delphi擅长的领域 并没有变化
------解决思路----------------------
有鸟用?????????????
------解决思路----------------------
说实话,像楼主代码里的不定长数组这类东西,我都不太会。。现在毕竟大部分代码还是用C++写。。
只有自己写一些GUI程序会用delphi,因为实在不通MFC等那些玩意。。
------解决思路----------------------
弱弱的问一下,现在Delphi在那些领域使用。自己没有再使用Delphi已经6-7年了。。。
在移动开发方便、稳定之前,Delphi擅长的领域 并没有变化
还好 :-) 之前主要是用Delphi做C/S架构的ERP系统什么的,当时觉着这东西简直好用的神了
------解决思路----------------------
弱弱的问一下,现在Delphi在那些领域使用。自己没有再使用Delphi已经6-7年了。。。
在移动开发方便、稳定之前,Delphi擅长的领域 并没有变化
还好 :-) 之前主要是用Delphi做C/S架构的ERP系统什么的,当时觉着这东西简直好用的神了![]()
从方便开发者的角度看,delphi是空前绝后的。。。。
所以用过delphi,再用别的语言工具,都觉得是回到原始社会了
------解决思路----------------------
随机化快排会好些.
------解决思路----------------------
mark之,有用!
------解决思路----------------------
支持一下,第一次看到用delphi研究算法的,嘿嘿。只要看到算法的东西都是c代码。
------解决思路----------------------
楼主的快速排序代码不对,这是Delphi自带的快速排序,速度遥遥领先其他所有算法,
而且即使1千万个数据也没有栈溢出
type
TIntArray=array of integer;
procedure QuickSort0(var A: TIntArray; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort0(A, iLo, Hi);
if Lo < iHi then QuickSort0(A, Lo, iHi);
end;
procedure QuickSort(var x:TIntArray);
begin
QuickSort0(x,Low(x),High(x));
end;