归并排序和基数排序 - Touale Cula's Blog

一、归并排序

算法思想:

将两个或两个以上的有序表组合成一个新的有序表。采用分治思想!

二路排序


思路排序


模拟实现


算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int *B = (int *)malloc((n+1)*sizeof(int));
void merge(int A[],int low,int mid,int high){
for(int k = low;k<=high;k++){
B[k] = A[k]; //将k中所有元素复制到B
}

int i,j;
for(i = low,j = mid + 1,k = i;i<=mid && j<= high;k++){
if(B[i]<=B[j]) A[k] == B[i++];
else A[k] = B[j++];
}

while(i<=mid) A[k++] = B[i++];
while(j<=high) A[k++] = B[j++];
}

void sort(int A[],int low,int high){
if(low<high){
int mid = (low+high)/2;
sort(A,low,mid);
sort(A,mid+1,high);
merge(A,low,mid,high);
}
}

算法评估

空间效率:$O(n)$
时间效率

  • $O(nlog_2n)$

稳定性:是


二、基数排序

算法思想:

不基于比较和移动进行排序,而是基于关键字各位的大小进行排序。


模拟实现

1.初始化数字


2.第一趟,对个位进行划分



3.对第一趟进行收集,重新转换成链表


4.以十位进行划分



5.重新转换成链表


6.以百位作为关键字进行划分


7.重新收集


8.汇总如下,最终排序结果


算法评估

空间效率:$O(r)$ (辅助存储空间为r,r个队列)
时间效率

  • $O(d(n+r))$ (d趟分配和收集,一趟分配要O(n),一趟收集需要O(r))

稳定性:是