数据结构(c语言)–排序算法(归并排序和基数排序)
一、归并排序(牺牲空间换时间的排序算法)
1、基本思想
"归并"的含义是将两个或两个以上的有序表组合成一个新的有序表。
思想:假定待排序表含有n个记录,则可将其视为n个有序的字表,每个字表的长度都是1,然后两两归并,得到n/2(上取整)个长度为n的有序表为止,这种排序算法称为二路归并排序。
2、代码实现
// 归并操作
void Merge(ElementType A[], int low, int mid, int high)
{
int i = low;
int j = mid + 1;
int k;
// 把子序列所有元素复制到B数组
for (int k = low; k <= high; k++)
B[k] = A[k];
for (k = low; 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++];
// 注:只有一个while会执行
}
// 归并排序
void MergeSort(ElementType A[], int low, int high)
{
// 划分子序列,分到每个子序列长度为1
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(A, low, mid);
MergeSort(A, mid + 1, high);
Merge(A, low, mid, high);
}
}
3、性能分析
时间复杂度:O(n*log2n)
空间复杂度:O(n)
稳定性:稳定的
二、基数排序
1、基本思想
基数排序:基于关键字各位的大小进行排序。
关键字排序的两种方法:最高位优先(降序序列)和最低位优先(升序序列)
2、性能分析
时间复杂度:O(d(n+r))–进行d趟分配和收集,一趟分配需要O(n),一趟收集需要O®
空间复杂度:O®一趟排序需要的辅助空间为r(r个队列)
稳定性:稳定的
3、适用性
- 关键字可方便拆分为d组,且d较少
- 关键字取值范围不大
- 数据元素个数较大