标签:
//二路归并算法描述为(a[s,t]中的数据由小到大合并到r[s,t]中)
//两个有序表a[s,m]和a[m+1,t]合并成一个有序表r[s,t]
//以下是算法的伪代码
1 procedur merge(s,m,t); 2 begin 3 (1) i:=s; j:=m+1; k:=s; 4 (2) while (i<=m) and (j<=t) do 5 if a[i]<=a[j] then [r[k]:=a[i];inc(i);inc(k)] 6 else [r[k]:=a[j];inc(j);inc(k)]; 7 (3) while i<=m do [r[k]:=a[i];inc(i);inc(k)]; 8 (4) while j<=t do [r[k]:=a[j];inc(j);inc(k)]; 9 end;
1 procedure mergesort(s,t:longint); //对数组a的s到t的区间进行排序,r为临时数组 2 var 3 m,i,j,k:longint; 4 begin 5 if s=t then exit; //如果区间只有1个数据就不用排了 6 m:=(s+t) div 2; //取区间中点 7 mergesort(s,m); //以中点二分,分别排序 8 mergesort(m+1,t); 9 i:=s; 10 j:=m+1; 11 k:=s; 12 while (i<=m) and (j<=t) do //合并两个子序列,直到其中一个取完数 13 if a[i]<=a[j] then 14 begin r[k]:=a[i];inc(i);inc(k);end 15 else 16 begin r[k]:=a[j];inc(j);inc(k);end; 17 while i<=m do begin r[k]:=a[i];inc(i);inc(k);end; //如果有剩余,直接复制到r 18 while j<=t do begin r[k]:=a[j];inc(j);inc(k);end; 19 for i:=s to t do a[i]:=r[i]; //合并后的数据放回a数组 20 end;
冒泡排序
插入排序
二叉树排序
归并排序
选择排序
快速排序
堆排序
冒泡排序
选择排序
插入排序
快速排序
归并排序
堆排序
标签:
原文地址:http://www.cnblogs.com/vacation/p/5180597.html