1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-06-16 15:07:38 +08:00

更新排序

This commit is contained in:
Didnelpsun
2021-10-03 23:17:16 +08:00
parent de44228084
commit ec1de8e8ab
2 changed files with 58 additions and 6 deletions

View File

@@ -41,3 +41,49 @@ $C.$每次划分后,先处理较短的分区可以减少递归次数
$D.$递归次数与每次划分后得到的分区的处理顺序无关
解:$D$。递归次数与各元素的初始排列有关。若每次划分后分区比较平衡,则递归次数少;若分区才平衡,递归次数多。递归次数与处理顺序是没有关系的。
## 选择排序
### 简单选择排序
**例题** 设线性表中每个元素有两个数据项$k_1$和$k_2$,现对线性表按以下规则进行排序:先看数据项$k_1$$k_1$值小的元素在前,大的元素在后;在$k_1$值相同的情况下,再看$k_2$$k_2$值小的在前,大的元素在后。满足这种要求的排序方法是()。
$A.$先按$k_1$进行直接插入排序,再按$k_2$进行简单选择排序
$B.$先按$k_2$进行直接插入排序,再按$k_1$进行简单选择排序
$C.$先按$k_1$进行简单选择排序,再按$k_2$进行直接插入排序
$D.$先按$k_2$进行简单选择排序,再按$k_1$进行直接插入排序
解:$D$。首先应确定$k_1$、$k_2$的排序顺序,若先排$k_1$再排$k_2$,则排序结果不符合题意,排除选项$A$、$C$。再考虑算法的稳定性,当$k_1$排好序后,再对$k_2$排序,若对$k_2$排序采用的算法是不稳定的,则对于$k_1$相同而$k_2$不同的元素可能会改变相对次序,从而不一定能满足题干中的条件“在$k_1$值相同的情况下,$k_2$值小的元素在前,大的元素在后”。直接插入排序算法是稳定的,而简单选择排序算法是不稳定的,故只能选$D$。
### 堆排序
**例题** 对关键码序列$\{23,17,72,60,25,8,68,71,52\}$进行堆排序,输出两个最小关键码后的剩余堆是()。
$A.\{23,72,60,25,68,71,52\}$
$B.\{23,25,52,60,71,72,68\}$
$C.\{71,25,23,52,60,72,68\}$
$D.\{23,25,68,52,60,72,71\}$
解:$D$。筛选法初始建堆为$\{8,17,23,52,25,72,68,71,60\}$,输出$8$后重建的堆为$\{17,25,23,52,60,72,68,71\}$,输出$17$后重建的堆为$\{23,25,68,52,60,72,71\}$。
## 归并排序
**例题** 下列排序方法中,排序过程中比较次数的数量级与序列初始状态无关的是()。
$A.$归并排序
$B.$插入排序
$c.$快速排序
$D.$冒泡排序
解:$D$。选择排序和归并排序都与序列初始状态无关。
<!-- ## 分配排序 -->

View File

@@ -196,11 +196,15 @@
#### 堆排序的过程
1. 每一趟将堆顶元素加入子序列(堆顶元素与待排序序列中的最后一个元素交换)。此时后面的这个元素就排序好了
每次将未排序记录中选择最值加入已排序序列末尾再调整
1. 每一趟将堆顶元素加入子序列(堆顶元素与待排序序列中的最后一个元素交换)。此时后面的这个元素就排序好了。最右下的元素作为堆顶元素。
2. 此时待排序序列已经不是堆了(堆顶被换成最小或最大的元素),需要将其再次调整为堆(小元素或大元素不断下坠)。
3. 重复步骤一二。
4. 直到$n-1$趟处理后得到有序序列。基于大根堆的堆排序会得到递增序列,而基于小根堆的堆排序会得到递减序列。
调整堆从右边即序列末尾开始。
#### 堆排序的性能
堆排序的存储就是它本身,不需要额外的存储空间,要么只需要一个用于交换或临时存放元素的辅助空间。所以空间复杂度为$O(1)$。
@@ -217,11 +221,11 @@
#### 堆的插入
新元素放到表尾,并与其$\lfloor\dfrac{i}{2}\rfloor$的父结点进行对比,若新元素比父元素更大(大根堆)或更小(小根堆),则二者互换,并保持上升,直到无法上升为止。
新元素放到表尾,并与其$\lfloor\dfrac{i}{2}\rfloor$的父结点进行对比,若新元素比父元素更大(大根堆)或更小(小根堆),则二者互换,并保持上升,直到无法上升为止。时间复杂度为树高$O(\log_2n)$。
#### 堆的删除
被删除的元素用堆底元素代替,然后让这个元素不断下坠,直到无法下坠为止。
被删除的元素用堆底元素代替,然后让这个元素不断下坠,直到无法下坠为止。时间复杂度为树高$O(\log_2n)$。
## 归并排序
@@ -255,7 +259,7 @@ $n$个元素二路归并排序,归并一共要$\log_2n$趟,每次归并时
### 基数排序
数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
#### 基数的定义
@@ -263,6 +267,8 @@ $n$个元素二路归并排序,归并一共要$\log_2n$趟,每次归并时
#### 基数排序的过程
有最高位优先$MSD$和最低位优先$LSD$两种方法。
若是要得到递减序列:
1. 初始化:设置$r$个空辅助队列$Q_{r-1},Q_{r-2},\cdots,Q_0$。
@@ -276,13 +282,13 @@ $n$个元素二路归并排序,归并一共要$\log_2n$趟,每次归并时
需要$r$个辅助队列,所以空间复杂度为$O(r)$。
一趟分配$O(n)$,一趟收集$O(r)$,一共有$d$趟分配收集,所以总的时间复杂度为$O(d(n+r))$。
一趟分配$O(n)$,一趟收集$O(r)$,一共有$d$趟分配收集,所以总的时间复杂度为$O(d(n+r))$。与序列初始状态无关。
基数排序是稳定的。
#### 基数排序的应用
对于一般的整数排序是可以按位排序的,也可以处理一些实际问题,如根据人的年龄排序,需要从年月日三个维度分别设置年份的队列、月份的队列(1到12、日的队列1到31
对于一般的整数排序是可以按位排序的,也可以处理一些实际问题,如根据人的年龄排序,需要从年月日三个维度分别设置年份的队列、月份的队列($1$到$12$)、日的队列($1$到$31$)。
所以基数排序擅长解决的问题: