二路归并排序
将待排序列分为左右两个子序列,
分别递归进行排序。
void mergesort(elemtype A[], int low, int high)
{
if(low<high)
{
int mid=(low+high)/2;
mergesort(A[],low,mid-1);
mergesort(A[],mid+1,high);
merge(A[],low,mid,high);
}
}
分配一个大小为n+1的辅助空间B[];
将所有的值复制到B[]上去。
比较两个子序列从前往后关键字的大小,
将小的那个复制到B中,同时该子序列指针往后移一位。
elemetype*B = (elemtype*)malloc((n+1)*sizeof(elemtype));
void merge(elemtype A[], int low, int mid ,int high)
{
for(i=1; i<=n; i++)
B[i]=A[i];
for(m=low,t=mid+1,i=1;m<=mid&&t<=high; m++,i++)
{
if(B[m]<=B[t])
{
A[i]=B[m];
m++;
}
else
{
A[i]=B[t];
t++;
}
}
while(m<=mid)
A[i++]=B[m++];
while(t<=high)
A[i++]=B[t++];
}
时间复杂度:O(nlog2n)
进行log2n次合并,每次合并的时间复杂度为O(n)
空间复杂度:O(n)
稳定性: 稳定
基数排序
LSD低位优先排序。
每个关键字由d元组(d个数字组成)组成,其中组成元素的种类为r个(0到9用到了几种数字)。一共有n个关键字。
排序过程需要r个队列。
首先:队列置空,然后最后一元的数字与队列代表的数字进行匹配,将关键字放入队列。(分配)
然后:将r个队列首尾相连,组成一个新的结点序列。(收集)
一共需要进行d次分配收集,最后得到的序列即为有序序列。
空间复杂度:O®
一共需要r个队列,且这些队列可以重复使用。
时间复杂度:O(d(n+r))
一共需要d趟分配收集,分配所需时间O(n)
收集所需时间O®
稳定性: 稳定