408数据结构学习笔记——归并排序、基数排序

简介: 408数据结构学习笔记——归并排序、基数排序

1.归并排序

1.1.算法思想

归并:把两个或者多个有序的序列表合并成一个(m路归并,每选出一个元素需要关键字为m - 1个)

将相邻的两个有序表归并为一个有序表

1.将顺序表中每两个相邻元素分为一组,进行排序:分组(49、38)(65、97)(66、13)(27)image.png2.将重复1操作直到序列有序:分组(38、49、65、97)(13、76、27)


4305f2669aa04e858ba0ec8afcb05a1b.png3.整个数组为一组,进行排序后,整组有序5f815756378a494bb032afbaa4a6658e.png

1.2.代码

//全局变量,申明一个大小为n + 1的数组(可以容纳下所有的数组元素)
elemtype *temp = (elemtype*)malloc(sizeof(elemtype) * (n + 1));
void Merge(int arr[], int low, int mid, int high){
    //将arr数组元素复制到temp中
    for (int k = low; k <= high; k++) temp[k] = arr[k];
    int i, j, k;
    //遍历数组
    for (i = low, j = low, k = mid + 1; j <= mid && k <= high; i++) {
        //将j和k指向的元素中更小的那个插入表中,并且其对应的指针往后移动
        if (temp[j] <= temp[k]) arr[i] = temp[j++];    //两个子表若元素相同,则优先选择左子表
        else arr[i] = temp[k++];
    }
    //将剩余元素插入到表中
    while (j <= mid) arr[i++] = temp[j++];
    while (j <= mid) arr[i++] = temp[k++];
}
void MergeSort(int arr[], int low, int high){
    if (low < high) {
        int mid = low + high / 2;
        //对左子表进行排序
        MergeSort(arr, low , mid);
        //对右子表进行排序
        MergeSort(arr, mid + 1, high);
        //对当前整个表进行排序
        Merge(arr, low, high);
    }//if
}

1.3.时间复杂度和稳定性

1.时间复杂度:O(nlog2n)

A.归并的过程类似二叉树,树高即为归并总次数→O(log2n)向上取整

B.每次归并的时间复杂度为O(n),指针需要从头到尾遍历一次数组

2.空间复杂度:O(n),辅助数组B需要复制数组元素

3.稳定性:稳定。左右两个数组中若同时出现相同元素,则优先将左边的元素加入数组中

2.基数排序

2.1.算法思想

不基于比较的算法

基于关键字的各个位数的大小进行排序

ce0631b40dca4651a124e07c05b5f544.png

1.初始化r个队列,按照关键字的权值递增的顺序(个十百),进行关键字总位数分配和收集

2.分配:遍历各个元素,根据当前轮次的关键字和当前元素的关键字位插入相应的链表中

3.收集:将各个队列中的元素依次出队,并首尾相接形成新的序列

2.2.手算实现过程

1.初始状态,申明十个队列分别表示当前位数上的数字为0 - 9

3ccaa32f269d47a99650ad6875ab2465.png

2.以个位进行匹配,按当前数字的个位入队到相应的队列中

ecd02ece69c845caa1d3c4e7f2bfb310.png3.为得到递减序列,按9 - 0 的顺序将各个队列中的元素依次出队,并首尾相接形成新的序列(实现按个位递减)388ff28bdf5c46cbac8af1b7bab2e780.png

4.基于3中结果,以十位进行匹配,按当前数字的十位挂到入队相应队列中。因为已经对个位排序,因此,每个队列中的元素按照个位递减的顺序排列

93eb2854c93043bd8ec1b7c4c3654b0e.png

fc17ac1ed2894b4db8a807197dac308a.png

5.为得到递减序列,按9 - 0 的顺序将各个队列中的元素依次出队,并首尾相接形成新的序列(实现按十位递减、十位相同按个位递减)

74587180a4a64338a7404efeb54559ee.png

6. 基于5中结果,以十位进行匹配,按当前数字的十位入队相应队列中。因为已经对十位排序,因此,每个队列中的元素按照十位递减的顺序排列

e8016333699e4ca282f550d396ccb1b8.png

85dd368bffb6493fbfc850d32cf6b91e.png

6.为得到递减序列,按9 - 0 的顺序将各个队列中的元素依次出队,并首尾相接形成新的序列(实现按百位递减、百位相同按十位递减、十位相同按个位递减)

632ccf3daf74400e8b54e2631981e726.png

image.png

2.3.时间复杂度和稳定性

1.空间复杂度:需要r个队列,每个队列需要的仅是头尾指针。O(r)

2.时间复杂度:O(d(n + r))

A.需要进行d趟(关键字个数)O(d)

B.每趟进行一次分配遍历 n 个元素O(n),一趟收集遍历r个队列O(r)。O(n + r)(可以为每个队列结构体中设置一个队尾元素指针,遍历队列的过程中将队尾指针的next域指向下一个队列的队首元素,不需要遍历队列中全部元素)

3.稳定性:稳定

2.4.基数排序的应用

例:生日(日→月→年)

1.数据元素可以被拆分为d个关键字(d不宜过大)(反例:身份证)

2.每个关键字的取值范围不大(反例:中文名字,虽然只有几个字,但是每个字有几千种可能)

3.数据元素的个数 n 很大(例子:给全中国人的身份证排序)





相关文章
|
9月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
存储 搜索推荐 算法
【初阶数据结构篇】归并排序和计数排序(总结篇)
归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤。
155 0
|
9月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
230 10
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
344 1
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
192 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
138 4
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
算法
数据结构与算法-归并排序
数据结构与算法-归并排序
69 2
|
搜索推荐
深入理解数据结构第六弹——排序(3)——归并排序
深入理解数据结构第六弹——排序(3)——归并排序
129 1

热门文章

最新文章